該文章記錄個人工作或者學習中經歷的mysql優化,該文章不做定時更新
1.1背景
用mysql儲存了一些不太更新的資料,且資料量不大,所以用到了一些join及子查詢
但是在開發階段也發現慢sql,但表資料量不足5k。
in 接子查詢是非常容易引發慢sql的,調優也比較難定位,一般這種推薦寫成兩個sql,將子查詢的結果直接放在第二個sql的in裡面。
select name
from t
where id in
( select t.id
from a
where age>10
)
sql的結構跟上類似,外層查詢id用了in,子查詢出來的資料都是可控的,不超過50條
使用explain進行分析
發現了dependent subquery這個關鍵字,及外層查詢id in操作怎麼檢索了這麼多條資料(這是主鍵)!
1.2原因
優化-mysql-dependent
網上一搜dependent subquery就很容易找到關於子查詢優化的文章,上面一篇挺好的!
原因是你以為sql會先 進行子查詢,然後將子查詢的介面 in一下就出來。但並不是
文中鏈結提到的《高效能mysql》的觀點,總之用子查詢(一般使用子查詢外層條件是 in),會造成外層查詢的全量檢索,導致查詢速度變慢。
1.3如何優化
可以使用臨時表進行join
select name
from t t1,(
select t.id
from a
where age>10
) t2
where t1.id=t2.id
這樣檢索的資料量就比較正常了
2.1 in子查詢引發外表全量掃表
2.2 索引列字段不一樣,例如varchar型別的索引,我們查詢時使用的是int型別,也不會命中索引
Mysql優化 慢查詢
先查詢是否開啟 開啟慢查詢日誌 set global slow query log 1 檢視引數設定 show variables like long query time 這裡查詢的是查過多少時間才會記錄成慢查詢 預設10 秒以上的s ql語句記錄到日誌中 修改引數 set global long...
Mysql慢查詢優化
二 優化這些慢查詢 3.細節優化 一般的應用系統,讀寫比例在10 1左右,而且插入操作和一般的更新操作很少出現效能問題,遇到最多的,也是最容易出問題的,還是一些複雜的查詢操作 修改配置檔案 在 my.ini 增加幾行 slow query log on log slow queries 儲存路徑 l...
Mysql 慢查詢優化
mysql 慢查詢的相關引數 使用show variables來查詢,set global來設定 slow query log 是否開啟慢查詢日誌,1表示開啟,0表示關閉。slow query log file mysql資料庫慢查詢日誌儲存路徑。可以不設定該引數,系統則會預設給乙個預設的檔案hos...