查詢優化
觀察,至少跑一天,看看生產的慢sql情況
開啟慢查詢日誌,設定閾值,比如超過5秒鐘的就是慢sql,並將它抓取出來
explain+慢sql分析
show profile
運維經理 or dba,進行資料庫伺服器引數的調優
===總結
慢查詢的開啟並捕獲
explain+慢sql分析
show profile查詢sql在mysql伺服器裡面執行細節和生命週期情況
sql資料庫伺服器的引數調優
優化原則:小表驅動大表
####################原理(rbo)#######################
select * from a where id in (select id from b)
#等價於
for select id from b
for select * from a where a.id = b.id
#當b表的資料集必須小於a表的資料集時,用in優於exist
select * from a where id exists(select 1 from b where b.id = a.id)
#等價於
for select * from a
for select * from b where b.id = a.id
#當a表的資料集必須小於b表的資料集時,用exists優於in
注意查詢順序問題
select __ from table where exists(subquery)
**可以理解為:**將主查詢的資料,放到子查詢中做條件驗證,根據驗證結果(true or false)來決定著查詢的資料結果是否保留
exists(subquery)只返回true or false,因此子查詢中的select*也可以時select 1或select 『x』,官方的說法是實際執行時會忽略select清單,因此沒有區別。盡量使用index方式排序,避免使用filesort方式exists子查詢執行過程可能經過了優化而不是我們理解上的逐條對比,如果擔憂效率問題,可進行實際檢驗以確定是否有效率問題。
exists子查詢往往也可以用條件表示式、其他子查詢或者join來替代,何種最優需要具體情況具體分析。
滿足兩種情況會使用index排序
#using index
explain select * from tbla where age > 20 order by age;
#using index,using filesort
explain select * from tbla where age > 20 order by birth;
#using index,using filesort
explain select * from tbla where age > 20 order by birth,age;
#using index
explain select * from tbla where birth > '2016-01-28 00:00:00' order by birth;
#using filesort 引索預設公升序
explain select * from tbla order by age asc,birth desc;
盡可能在索引列上完成排序操作,遵照索引最佳左字首
如果不在索引列上,filesort有兩種演算法,雙路排序和單路排序
有可能取出的資料總大小超出了sort_buffer 的總容量,導致每次只能取sort_buffer容量大小的資料,進行排序排完再取,從而進行多次i/o,反而導致大量i/o操作,反而得不償失。調優: 1.order by時不要加select *
1.1 當query的字段大小總和小於max_length_for_sort_data而且排序字段不是text|bolb型別時,會用改進後的演算法,否則使用—多路排序
1.2 兩種演算法的資料都有可能超出sort_buffer的容量時,超出之後,會建立tmp檔案進行合併排序,導致多次i/o,用單路排序的風險更大
2.嘗試提高sort_buffer_size
3.嘗試提高max_length_for_sort_data
如果設得太大,總容量超出sort_buffer_sizes的概率就增大,明顯症狀就是高的i/o活動和低的處理器使用率。
查詢擷取分析
預設關閉,預設情況下slow query log的值為off,表示慢查詢日誌是禁用的,show variables like slow query log set global slow query log 1 重啟服務失效show variables like long query time 預設...
查詢擷取分析
show variables like slow query log set global slow query log 1 show variables like long query time set global long query time 0.1 show processlist kil...
14 查詢擷取分析
mysql的慢查詢日誌是mysql提供的一種日誌記錄,它用來記錄在mysql中響應時間超過閥值的語句,具體指執行時間超過long query time值的sql。long query time的預設值為10,意思是執行10秒以上的語句。預設情況下slow query log的值為off,表示慢查詢日...