【數據庫】-- MySQL SQL調優筆記(2)

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,數據庫會認爲索引列可能存在空值,也不會按照索引進行計算;

運:運算,對索引列進行加減乘除等運算會導致索引失效;

最:最左原則的意思,在複合索引中,索引列的順序非常重要,如果不是按照索引列最左列開始進行查找,則無法使用索引;

快:全表掃描更快的意思,如果數據庫預計使用全表掃描比使用索引更快,那就不會使用索引

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章