為什麼我只查一行的語句,也執行這麼慢
一:mysql> CREATE TABLE `t` (
`id` int(11) NOT NULL,
`c` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=100000)do
insert into t values(i,i)
set i=i+1;
end while;
end;;
delimiter ;
call idata();
第一類:
mysql> select * from t where id=1;
show processlist 分析一下:
(1)等mdl 鎖
這個狀態表示有一個執行緒正在表t上請求或者持有mdl寫鎖,把select 堵住了。
這類問題的處理方法:找到誰持有mdl寫鎖,然後把它kill掉。
在performance_schema 和sys 系統中查。
通過查詢sys.schema_table_lock_waits 就可以直接找到阻塞的process id .把這個連線用kill命令斷開。
等flush
mysql> select * from information_schema.processlist where id=1;
表示的是現在有一個執行緒正要對錶t做flush操作。
flush tables t with read lock;
flush tables with read lock;
關閉表t ,關閉mysql裡所有開啟的表。
原因:
等行鎖:
mysql> select * from t where id=1 lock in share mode;
怎麼查出誰佔得這個寫鎖。
mysql> select * from t sys.innodb_lock_waits where locked_table=`'test'.'t'`\G
kill 4.
第二類:查詢慢
mysql> select * from t where c=50000 limit 1;
這裡如何沒有索引就會查詢50000條,所以慢。
mysql> select * from t where id=1;
練習:
mysql> CREATE TABLE `table_a` (
`id` int(11) NOT NULL,
`b` varchar(10) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `b` (`b`)
) ENGINE=InnoDB;
mysql> select * from table_a where b='1234567890abcd';
這條語句執行慢?