12 s查詢擷取分析

2021-10-09 07:38:47 字數 2285 閱讀 3755

查詢優化

觀察,至少跑一天,看看生產的慢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清單,因此沒有區別。

exists子查詢執行過程可能經過了優化而不是我們理解上的逐條對比,如果擔憂效率問題,可進行實際檢驗以確定是否有效率問題。

exists子查詢往往也可以用條件表示式、其他子查詢或者join來替代,何種最優需要具體情況具體分析。

盡量使用index方式排序,避免使用filesort方式

滿足兩種情況會使用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,表示慢查詢日...