1. 程式人生 > >為什麼我只查一行的語句,也執行這麼慢

為什麼我只查一行的語句,也執行這麼慢

一: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';
這條語句執行慢?