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,数据库会认为索引列可能存在空值,也不会按照索引进行计算;
运:运算,对索引列进行加减乘除等运算会导致索引失效;
最:最左原则的意思,在复合索引中,索引列的顺序非常重要,如果不是按照索引列最左列开始进行查找,则无法使用索引;
快:全表扫描更快的意思,如果数据库预计使用全表扫描比使用索引更快,那就不会使用索引