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)复合索引