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,資料庫會認為索引列可能存在空值,也不會按照索引進行計算;
運:運算,對索引列進行加減乘除等運算會導致索引失效;
最:最左原則的意思,在復合索引中,索引列的順序非常重要,如果不是按照索引列最左列開始進行查找,則無法使用索引;
快:全表掃描更快的意思,如果資料庫預計使用全表掃描比使用索引更快,那就不會使用索引
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/386491.html
標籤:MySQL
上一篇:Python中的串列索引超出范圍錯誤(讀取CSV檔案)
下一篇:Redis入門及常用命令學習
