1.常規索引優化方式
1.1.單表優化
# 查詢category_id爲1且comments大於1的情況下,views最多的article id SELECT id, author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1; EXPLAIN SELECT id, author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1; # 單表優化--建立對應索引 優化方案:cv建立索引 create index idx_article_cv on article(category_id,views);
總結:mysql索引是遵從B樹索引原則,當建立ccv索引時,先排序category_id,如果遇到相同的category_id則再排序comments,如果遇到相同的comments則再排序
views。而如果處於聯合索引中間位置的字段comments > 1是一個範圍值(range),則無法利用索引再對後面的views部分進行檢索,即range類型查詢字段後面的
索引會失效。
這種情況建立cv索引最好。
1.2.兩表優化
EXPLAIN SELECT b.bookid,c.card FROM book b LEFT JOIN class c ON b.card = c.card; # 優化方案:兩表連接,左連接索引建立在右表,右連接索引建立在左表;或者查詢對調位置 create index idx_class_card on class(card);
總結:兩表連接,左連接索引建立在右表,右連接索引建立在左表;或者查詢對調位置。
且注意小表驅動大表。
1.3.三表優化
# 針對連接的第三張表phone再在右表phone上建立一個索引 create index idx_class_card on class(card); create index idx_phone_card on phone(card); EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card LEFT JOIN phone ON book.card = phone.card;
總結:三表連接,左連接索引建立在右表連接字段上,右連接建立在左表連接字段上;且注意小表驅動大表;如上,LEFT JOIN都建立在右表連接字段上。
三表連接,建立了兩個表的索引。
2.索引失效
模:模糊查詢,like 如果以%開頭,索引會失效;
型:數據類型,如果數據類型錯誤了,索引會失效;
數:函數,對索引字段使用內部函數,索引會失效,應該建立基於函數的索引;
空:null,索引不存儲空值,如果不限制索引列是not null,數據庫會認爲索引列可能存在空值,也不會按照索引進行計算;
運:運算,對索引列進行加減乘除等運算會導致索引失效;
最:最左原則的意思,在複合索引中,索引列的順序非常重要,如果不是按照索引列最左列開始進行查找,則無法使用索引;
快:全表掃描更快的意思,如果數據庫預計使用全表掃描比使用索引更快,那就不會使用索引