目標(biāo):
掌握常見(jiàn)的優(yōu)化方法
一. 如何通過(guò)慢日志發(fā)現(xiàn)有問(wèn)題的sql?
(1)查詢次數(shù)多且每次查詢占用時(shí)間長(zhǎng)的sql
通過(guò)pt-query-digest分析查詢sql
(2)IO比較大的sql
通過(guò)pt-query-digest分析Rows examine項(xiàng)
(3)未命中索引的sql
通過(guò)pt-query-digest分析Rows examine項(xiàng)和Rows send對(duì)比
二.如何分析sql查詢
通過(guò)explain sql;
EXPLAIN SELECT count(*) from mmall_cart

解析結(jié)果:
table:顯示這一行的數(shù)據(jù)時(shí)關(guān)于那張表
type:顯示連接使用了哪種類型,從嘴和到最差的鏈接類型為const、eq_req、ref、range、index和ALL。
possible_keys:顯示可能應(yīng)用在這張表的索引,如果為空,沒(méi)索引。
key:實(shí)際使用的索引。
key_len:使用索引的長(zhǎng)度,在不損壞精確性的情況下,索引的長(zhǎng)度越短越好。
ref:顯示索引被是使用。
rows:MYSQLr認(rèn)為必須檢查的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù)。
using filesort:出現(xiàn)這個(gè)則sql需要優(yōu)化。MYSQL需要進(jìn)行額外的步驟來(lái)發(fā)現(xiàn)如何對(duì)返回的行排序。他根據(jù)連接誒性一級(jí)存儲(chǔ)排序鍵值和匹配條件的全部行的行指針來(lái)排序全部行。
using temporary:出現(xiàn)這個(gè)sql需要優(yōu)化。MYSQL需要?jiǎng)?chuàng)建一個(gè)臨時(shí)表存儲(chǔ)結(jié)果。這通常發(fā)生在對(duì)不同的列集進(jìn)行ORDER BY上而不是GROUP BY上。
三.常見(jiàn)sql優(yōu)化
(1)max()優(yōu)化
select max(payment_date) from payment;
優(yōu)化方式:創(chuàng)建索引
create index idx_paydate on payment (payment_date)
(2)count()優(yōu)化
count(id)代替count(*),count(id)查詢不會(huì)查詢null的數(shù)據(jù)
(3) limit優(yōu)化
limit常用語(yǔ)分頁(yè)處理,伴隨著order by從句使用會(huì)出現(xiàn)IO問(wèn)題。
select film_id,description from film order by title limit 50,5;
優(yōu)化方法:
使用有索引的列或主鍵進(jìn)行order by處理。
select film_id,description from film order by film_id limit 50,5;
記錄上次返回的主鍵,在下次查詢時(shí)使用主鍵過(guò)濾
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從句出現(xiàn)的列
索引字段越小越好
離散度大的列放到聯(lián)合索引的前面。