19 為什麼我只查一行的語句,也很慢
建表語句,並且插入資料
mysql> create tablet
(
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 tabletable_a
(
id
int(11) not null,
b
varchar(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。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為 髒頁 記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁就一致,稱為 ...