mysql實戰45講學習筆記--19

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’;
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章