19 爲什麼我只查一行的語句,也很慢
建表語句,並且插入數據
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();
不同場景的情況
1.查詢長時間不返回
mysql> select * from t where id=1;
一般這種情況是表t被鎖住了,查詢錯誤時,一般執行show processlist命令,查看當前語句處於什麼位置
等MDL鎖
出現這種狀態表示,現在有一個線程正在表t上請求或者持有MDL寫鎖,把select語句堵住了。
這類問題的處理方式是,找到誰持有MDL寫鎖,找到就kill掉。
等flush
另一種查詢被堵住的情況
mysql> select * from information_schema.processlist where id=1;
執行完之後查看線程狀態爲Waiting for table flush 表示現在有一個線程在做flush操作
一般有兩種flush操作用法
flush tables t with read lock;
flush tables with read lock;
等行鎖
等行鎖的時候就是因爲連接被斷開的時候,會自動回滾這個連接裏面正在執行的線程。因此解決辦法就是kill這個線程。
第二類,查詢慢
mysql> select * from t where c=50000 limit 1;
因爲c字段沒有索引,因此只能走主鍵順序掃描,因此需要掃描50000行。
壞查詢不一定是慢查詢
mysql> select * from t where id=1;
這個是一致性讀,需要執行undo log將結果執行到才返回。因此數據越長越慢
mysql> select * from t where id=1 lock in share mode
這是當前讀,只需要讀當前的值,不需要執行undo log ,因此加了鎖還比較快
問題
mysql> CREATE TABLE table_a
(
id
int(11) NOT NULL,
b
varchar(10) DEFAULT NULL,
PRIMARY KEY (id
),
KEY b
(b
)
) ENGINE=InnoDB;
假設現在表裏面,有 100 萬行數據,其中有 10 萬行數據的b的值是‘1234567980’,執行語句
mysql> select * from table_a where b=‘1234567890abcd’;