1.善于使用expain
explain的使用清晰度展示了一些需要添加索引以及其它的一些性能信息辐烂,可以根據(jù)查看explain的結(jié)果對(duì)語(yǔ)句進(jìn)行優(yōu)化
2.切分查詢
感覺(jué)計(jì)算機(jī)里面分而治之的思想無(wú)處不在亏掀,這里切分查詢既是這個(gè)思想的一次展示,如果我們想刪除一年的數(shù)據(jù)渤弛,如果一次性刪除的話對(duì)數(shù)據(jù)庫(kù)祝拯,會(huì)占用大量資源,可能造成阻塞她肯,對(duì)正常的服務(wù)器運(yùn)行產(chǎn)生波動(dòng)影響佳头,
策略:將一次性刪除改為每次刪除1-3萬(wàn)行數(shù)據(jù)(這里可根據(jù)自己的服務(wù)器性能進(jìn)行變動(dòng),使用工具找到影響最小的)晴氨,在每次刪除后最好暫停一下康嘉,這樣能將整個(gè)數(shù)據(jù)操作分散到更長(zhǎng)的時(shí)間線中,對(duì)服務(wù)影響更小
3.特定類(lèi)型優(yōu)化查詢
(1).count()簡(jiǎn)單優(yōu)化
常見(jiàn)誤解:count函數(shù)在MyISAM中非匙亚埃快
答:只有在沒(méi)有where條件的情況下才能非惩ふ洌快
select count(*) from world.city where id > 5;
通過(guò)explain可以看出這個(gè)sql語(yǔ)句在我的數(shù)據(jù)庫(kù)中掃描了5000行左右代碼,那么如何進(jìn)行優(yōu)化枝哄,可以倒過(guò)來(lái)查詢啊
select (select count(*) from world.city) - count(*) from world.city where id < 5
這樣從小的開(kāi)始排查大大減少了查詢行數(shù)块蚌,是個(gè)不錯(cuò)的查詢方式。
(2) group by優(yōu)化
最好優(yōu)化策略:
◆ GROUP BY 條件字段必須在同一個(gè)索引中最前面的連續(xù)位置;
◆在使用GROUP BY 的同時(shí)膘格,只能使用 MAX 和 MIN 這兩個(gè)聚合函數(shù);
◆如果引用到了該索引中 GROUP BY 條件之外的字段條件的時(shí)候峭范,必須以常量形式存在
(3) limit優(yōu)化
limit 在數(shù)據(jù)量不大的情況下非常適合分頁(yè),再加上索引瘪贱,相當(dāng)方便纱控,
但是在數(shù)據(jù)量便宜很大的情況下就不是很合適了,這里我們引入mysql的一種查詢方法菜秦。
延遲查詢:通過(guò)使用覆蓋索引查詢返回需要的主鍵,再根據(jù)主鍵關(guān)聯(lián)原表獲得需要的數(shù)據(jù)甜害。
再說(shuō)白點(diǎn)就是先查主鍵,在關(guān)聯(lián)到數(shù)據(jù)球昨,來(lái)看例子:
select film_id, description from sakila.film order by title limit 50000, 5;
查詢五萬(wàn)條之后的五條數(shù)據(jù)
優(yōu)化:
select film.film_id, film.discription from sakila.film inner join (
select film_id, description from sakila.film order by title limit 50000, 5
) as lim using(film_id);
這里我們通過(guò)子查詢先查詢了符合條件的id尔店,然后在關(guān)聯(lián)到表中,查詢效率提升好幾倍
-------------------------------------暫時(shí)到這里主慰,后續(xù)對(duì)文章進(jìn)行繼續(xù)補(bǔ)充