1.找到問題,哪里特變慢
2、最簡單的優化方式,讓性能翻倍
3.解析阿里規范讓性能翻倍
4.通過索引讓新能飆升(這里有深坑)
5.解決神坑,終極殺器-執行計劃
執行計劃explain type system>const>eq_ref>ref>range>index>all最好到最差依舊是
左連接時,右表加索引。反過來也一樣,也相反加索引。
索引優化
右邊加%,會導致索引失效,如果必須加右邊%才能查,可以用覆蓋索引來解決這個問題
什么叫做覆蓋索引?
? ? ? 在了解覆蓋索引之前我們先大概了解一下什么是聚集索引(主鍵索引)和輔助索引(二級索引)
? ? ? 聚集索引(主鍵索引):
? ? ? ? ? 聚集索引就是按照每張表的主鍵構造一顆B+樹,同時葉子節點中存放的即為整張表的記錄數據。
? ? ? ? ? 聚集索引的葉子節點稱為數據頁,聚集索引的這個特性決定了索引組織表中的數據也是索引的一部分。
? ? ? 輔助索引(二級索引):
? ? ? ? ? 非主鍵索引,葉子節點=鍵值+書簽。Innodb存儲引擎的書簽就是相應行數據的主鍵索引值。
? ? ? ? 再來看看什么是覆蓋索引,有下面三種理解:
解釋一: 就是select的數據列只用從索引中就能夠取得,不必從數據表中讀取,換句話說查詢列要被所使用的索引覆蓋。
解釋二: 索引是高效找到行的一個方法,當能通過檢索索引就可以讀取想要的數據,那就不需要再到數據表中讀取行了。如果一個索引包含了(或覆蓋了)滿足查詢語句中字段與條件的數據就叫 做覆蓋索引。
解釋三:是非聚集組合索引的一種形式,它包括在查詢里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆蓋查詢語句[select子句]與查詢條件[Where子句]中所涉及的字段,也即,索引包含了查詢正在查找的所有數據)。
不是所有類型的索引都可以成為覆蓋索引。覆蓋索引必須要存儲索引的列,而哈希索引、空間索引和全文索引等都不存儲索引列的值,所以MySQL只能使用B-Tree索引做覆蓋索引
當發起一個被索引覆蓋的查詢(也叫作索引覆蓋查詢)時,在EXPLAIN的Extra列可以看到“Using index”的信息
? ? ? 從執行結果上看,這個SQL語句只通過索引,就取到了所需要的數據,這個過程就叫做索引覆蓋。