MySQL之联合索引

index(a, b, c) 为例:

语句 发挥作用的索引 记忆方法(以三块板子过河记忆, 顺序很重要)
WHERE a=3 只用到了a列 只走了a板子
WHERE a=3 AND b=5 使用了a、b列 只走了ab两块板子
WHERE a=3 AND b=4 AND c=5(不论顺序) 使用了a、b、c列 走了所有的板子
WHERE b=4 AND c=5 或 WHERE b=4 因为a板子没走,所以衔接不上b和c板子
WHERE a=3 AND c=5 用到a,没用到c 只走了a,b没走就衔接不上c
WHERE a=3 AND b>10 AND c=7 用到了a、b列 走完了a,b走了一半,与c衔接不上了
WHERE a=3 AND b LIKE '***%' AND c=7 用到了a、blie 走完了a,b走了前一半,与c衔接不上了
WHERE a=3 AND b LIKE '%***' AND c=7 只用到了a列 走完了a,b走了后一半,但b前半段与a衔接不上了,走也是白走
WHERE a=3 AND c>10 AND b=4 用到了a、b、c列 走完了a和b,c只走了一半

注意:1)例子里都是 WHERE 语句,但 ORDER BY/GROUP BY 等都会用到索引,分析与上面一样

        2)MySQL会一直向右匹配,直到查询中遇到范围查询(<、>、between、like)等就停止匹配

        3)具体分析用explain语句,详细参见http://www.zixue.it/thread-9218-1-1.html

一道面试题:

有商品表,商品id列goods_id,栏目列cat_id,价格列price。

问题:已在价格列上添加索引,但按价格查询还是很慢,为什么?怎么解决?

答:在实际场景中,一个电商网站的商品很多,用户很少上来就按价格查询,一般会进到分类或品牌下再进行查询。

解决方法:去掉单独的price列的索引,增加(cat_id,price)复合索引。

              如果根据日志统计发现许多人按照品牌来查询,也可以改为(cat_id,brand_id,price)复合索引

原文地址:https://www.cnblogs.com/liuq/p/6495288.html