SELECT t1.c1, t2.c2 FROM table1 t1, table1 t2 WHERE t2.c2>0 AND t2.c3=1 AND t1.c2=0 AND t1.c4=t2.c4;都是table1表,这个没有笔误
谢谢

解决方案 »

  1.   

    执行explain SELECT t1.c1, t2.c2 FROM table1 t1, table1 t2 WHERE t2.c2>0 AND t2.c3=1 AND t1.c2=0 AND t1.c4=t2.c4; 贴出结果
      

  2.   

    t1、t2 的 c4添加索引
      

  3.   

    加了一些索引
    +----+-------------+-------+------+-----------------------------------------+---------------+---------+-------+------+-------------+
    | id | select_type | table | type | possible_keys                           | key           | key_len | ref   | rows | Extra       |
    +----+-------------+-------+------+-----------------------------------------+---------------+---------+-------+------+-------------+
    |  1 | SIMPLE      | a     | ref  | idx_c3_c4                               | idx_c3_c4     | 3       | const | 18900| Using where |
    |  1 | SIMPLE      | b     | ref  | idx_c2_c3                               | idx_c2_c3     | 8       | const |    1 | Using where |
    +----+-------------+-------+------+-----------------------------------------+---------------+---------+-------+------+-------------+
      

  4.   

    执行计划中的ref都是const 属于很好的计划了所以建议不用再进一步优化
      

  5.   

    谢谢,是不是这类多条件select的语句最好的优化就是添加适当的索引来解决呢?
    ps,请问有关于执行计划的好一点的资料吗
      

  6.   

    创建如下索引。create index x1 on table1 (c2,c4,c1);
    create index x3 on table1 (c4,c3,c2);
    create index x2 on table1 (c3,c2,c4);
    create index x4 on table1 (c4,c2,c1);
      

  7.   

    谢谢,这个很好用。
    请问这些索引为何这么创建?规则有哪些?谢谢这些索引中起作用应该仅是两个。 可以通过explain select ...得到哪个索引被使用了。为什么创建这么多,是因为不知道表中的数据分布是如何。一个一个问楼主的的话,估计得累死,索性可能用到的都创建了,省得麻烦。