目標:
掌握常見的優化方法
一. 如何通過慢日志發現有問題的sql?
(1)查詢次數多且每次查詢占用時間長的sql
通過pt-query-digest分析查詢sql
(2)IO比較大的sql
通過pt-query-digest分析Rows examine項
(3)未命中索引的sql
通過pt-query-digest分析Rows examine項和Rows send對比
二.如何分析sql查詢
通過explain sql;
EXPLAIN SELECT count(*) from mmall_cart
image.png
解析結果:
table:顯示這一行的數據時關于那張表
type:顯示連接使用了哪種類型,從嘴和到最差的鏈接類型為const、eq_req、ref、range、index和ALL。
possible_keys:顯示可能應用在這張表的索引,如果為空,沒索引。
key:實際使用的索引。
key_len:使用索引的長度,在不損壞精確性的情況下,索引的長度越短越好。
ref:顯示索引被是使用。
rows:MYSQLr認為必須檢查的用來返回請求數據的行數。
using filesort:出現這個則sql需要優化。MYSQL需要進行額外的步驟來發現如何對返回的行排序。他根據連接誒性一級存儲排序鍵值和匹配條件的全部行的行指針來排序全部行。
using temporary:出現這個sql需要優化。MYSQL需要創建一個臨時表存儲結果。這通常發生在對不同的列集進行ORDER BY上而不是GROUP BY上。
三.常見sql優化
(1)max()優化
select max(payment_date) from payment;
優化方式:創建索引
create index idx_paydate on payment (payment_date)
(2)count()優化
count(id)代替count(*),count(id)查詢不會查詢null的數據
(3) limit優化
limit常用語分頁處理,伴隨著order by從句使用會出現IO問題。
select film_id,description from film order by title limit 50,5;
優化方法:
使用有索引的列或主鍵進行order by處理。
select film_id,description from film order by film_id limit 50,5;
記錄上次返回的主鍵,在下次查詢時使用主鍵過濾
select film_id,description from film where film_id>55 and film_id<60 order by film_id limit 1,5;
(4)如何選擇合適的列建立索引?
在where從句,order by從句,order by從句,on從句出現的列
索引字段越小越好
離散度大的列放到聯合索引的前面。