我们建立了两个索引,分别为主键索引id和普通索引product_id
如果我们的where条件中存在or,及时其中带索引,也不会命中索引。这也是为什么尽量使用or的原因
我们通过主键索引查询,可以看见命中了索引:
而我们在where 条件后面加上or之后,就不会命中索引了:
可以看到如果用like查询的话,%在右边会命中索引的,而%在左边则不会。当然这也不是绝对的,当我们使用索引列进行查询的时候,就都会命中索引了:
NOT IN,NOT LIKE,NOT EXTSTS都不会命中索引
MySQL的复合索引可以创建多个,每个复合索引可以包含一列或多列。复合索引使用的基本原则是左侧对齐原则。例如,复合索引包含A,B,C字段,实际相当于创建了5个索引,即:
那么问题来了,如果我们创建两个复合索引,复合索引1:包含A,B,C列和复合索引2:包含B,C列,MySQL如何执行呢?
按照正常的逻辑,和复合索引的原则,应该能命中的索引是A_B_C_index,让我们拭目以待吧!
结果:和上次测试的不一致,这次虽然包含ABC三个列,但命中的索引是B_C_index
重要结论:当命中两个或者多个不同的复合索引时,按照创建顺序不同,MySQL会有不同策略来选取其中的一个复合索引。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)