刚接触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的时候使用吗?

解决方案 »

  1.   

    1:索引只在筛选、关联条件时起作用,所以group by 和 order by 无效
    2:查看索引使用情况,用explain +yoursql
    3:以下是百度百科对联合索引的解释
    你经常要用到多个字段的多条件查询,可以考虑建立联合索引,一般是除第一个字段外的其它字段不经常用于条件筛选情况,比如说a,b 两个字段,如果你经常用a条件或者a+b条件去查询,而很少单独用b条件查询,那么可以建立a,b的联合索引。如果a和b都要分别经常独立的被用作查询条件,那还是建立多个单列索引
      

  2.   

    恩,这些我是知道的,就是我用explain观察的时候on和where好像不能同时使用联合索引
      

  3.   

    不一定,要看具体情况。不是,索引要根据表的中记录总数和不同值的分布而定。要看具体的语句和索引分布。那我最后问一下,就是因为我最近看下来的结果是left join性能很差,那当我给where建索引对性能提高不大时,是不是应该给where和on里的条件建立联合索引?
    然后还有就是这时候不考虑on和where两个列筛选性的区别,根据联合索引必须第一个列被使用以及sql执行时先执行join后执行where的特性,应该把哪个列放在联合索引的前面呢?
      

  4.   

    select a.* from tableA a left join tableB b on a.id=b.id where a.name='test';楼主可以自己思考一下,如果自己是计算机,会怎么执行这个语句?你会打开A表,逐记录循环处理看是否符合name='test' 如果符合则去B表中找对应记录,还是有其它什么不同方式?这个话题牵涉面很多,如果讨论则必须在提供
    explain select ...
    show index from ..
    的基础上进行分析。 比如如果A,B表中都只有一条记录,则什么索引都不起作用。基础知识在 离散数学中的关系运算中有详细解释,或者 《数据库系统概论(第四版)》 王珊 萨师煊   高等教育出版社  也有例子。
      

  5.   

    今天又碰到一个现象
    首先like首位就是%不是应该不能使用索引吗,其次这个索引rows数量为什么比这个表中总记录数还多?
      

  6.   

    还有一个问题是,假如我有一个联合索引,用explain看到这个索引被使用了,那我还能不能更进一步的知道这个索引的哪个字段被使用了?