mysql實戰45講學習筆記 19

2021-09-25 17:28:14 字數 1917 閱讀 9500

19 為什麼我只查一行的語句,也很慢
建表語句,並且插入資料

mysql> create tablet(

idint(11) not null,

cint(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 tabletable_a(

idint(11) not null,

bvarchar(10) default null,

primary key (id),

keyb(b)

) engine=innodb;

假設現在表裡面,有 100 萬行資料,其中有 10 萬行資料的b的值是『1234567980』,執行語句

mysql實戰45講學習筆記 02

2.日誌系統 一條sql更新語句是如何執行的 一條查詢語句執行過程是經過聯結器,分析器,優化器,執行器等功能模組最後到達儲存引擎 查詢語句的流程,更新語句也是會同樣走一遍。更新流程還涉及兩個重要的日誌系統,redo log 重做日誌 和binlog 歸檔日誌 重要的日誌模組 redo log mys...

mysql實戰45講學習筆記 11

11 怎麼給字串欄位加索引字首索引的優勢,選取欄位前幾個作為索引,占用的空間更小 使用字首索引,定義好長度,就可以做到既節省空間,又不用額外增加太多的查詢成本。建立索引的時候關注的是區分度,區分度越高越好,區分度越高,意味著重複的鍵值越少,因此,可以通過統計索引上有多少不同的值來判斷使用多長字首。m...

mysql實戰45講學習筆記 12

為什麼我的mysql 抖 了一下一條sql語句,正常執行的時候特別快,但有時會突然變得特別慢,並且隨機,持續時間短。將對應的記憶體資料寫入到磁碟的過程,叫做flush。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁就一致,稱為 ...