刚接触Mysql没多久,最近在SQL优化的时候发现一个问题,不知道是不是我理解的这样。就是对于一个又有join又有where的SQL
类似于
select a.* from tableA a left join tableB b on a.id=b.id where a.name='test';假如在a表上添加一个联合索引(id,name),他能既在on的时候使用索引又在where的时候使用这个索引吗?
我观察出来的情况好像是不可以,如果不可以的话,针对这种情况,只能选择一个地方创建索引吗?还有,假如后面还有group by或者order by age的话,联合索引里加上age,会在group by或者order by的时候使用吗?
类似于
select a.* from tableA a left join tableB b on a.id=b.id where a.name='test';假如在a表上添加一个联合索引(id,name),他能既在on的时候使用索引又在where的时候使用这个索引吗?
我观察出来的情况好像是不可以,如果不可以的话,针对这种情况,只能选择一个地方创建索引吗?还有,假如后面还有group by或者order by age的话,联合索引里加上age,会在group by或者order by的时候使用吗?
2:查看索引使用情况,用explain +yoursql
3:以下是百度百科对联合索引的解释
你经常要用到多个字段的多条件查询,可以考虑建立联合索引,一般是除第一个字段外的其它字段不经常用于条件筛选情况,比如说a,b 两个字段,如果你经常用a条件或者a+b条件去查询,而很少单独用b条件查询,那么可以建立a,b的联合索引。如果a和b都要分别经常独立的被用作查询条件,那还是建立多个单列索引
然后还有就是这时候不考虑on和where两个列筛选性的区别,根据联合索引必须第一个列被使用以及sql执行时先执行join后执行where的特性,应该把哪个列放在联合索引的前面呢?
explain select ...
show index from ..
的基础上进行分析。 比如如果A,B表中都只有一条记录,则什么索引都不起作用。基础知识在 离散数学中的关系运算中有详细解释,或者 《数据库系统概论(第四版)》 王珊 萨师煊 高等教育出版社 也有例子。
首先like首位就是%不是应该不能使用索引吗,其次这个索引rows数量为什么比这个表中总记录数还多?