CREATE TABLE 'key_t'
(
'id' int(11) NOT NULL auto_increment,
'key1' int(11) NOT NULL default '0',
'key2' int(11) NOT NULL default '0',
'key3' int(11) NOT NULL default '0',
PRIMARY KEY ('id'),
KEY 'normal_key' ('key1','key2','key3')
)ENGINE=InnoDB这个SQL在上面的表上执行,Where子句和Order by 子句是否都用到了normal_key索引?
select * from key_t where key1=1 order by key3

解决方案 »

  1.   

    EXPLAIN一下
    mysql> explain select * from key_t where key1=1 order by key3;
    +----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
    | id | select_type | table | type | possible_keys | key        | key_len | ref   | rows | Extra                                    |
    +----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
    |  1 | SIMPLE      | key_t | ref  | normal_key    | normal_key | 4       | const |    1 | Using where; Using index; Using filesort |
    +----+-------------+-------+------+---------------+------------+---------+-------+------+------------------------------------------+
    1 row in set (0.03 sec)
      

  2.   

    我想知道为什么 order by key3没用使用索引?
      

  3.   


    因为你没有关于 key3 的索引。 只有一个 ('key1','key2','key3') ,这个索引并不适用。
      

  4.   

    建一个index(key1,key3)就可以使用索引了。
      

  5.   

    http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#multiple-column-indexes
    假定你执行下面的SELECT语句:mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
    如果col1和col2上存在一个多列索引,可以直接取出相应行。如果col1和col2上存在单列索引,优化器试图通过决定哪个索引将找到更少的行来找出更具限制性的索引并且使用该索引取行。如果表有一个多列索引,优化器可以使用最左面的索引前缀来找出行。例如,如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)和(col1,col2,col3)上的搜索进行了索引。如果列不构成索引最左面的前缀,MySQL不能使用局部索引。假定有下面显示的SELECT语句。 
    SELECT * FROM tbl_name WHERE col1=val1;
    SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
     
    SELECT * FROM tbl_name WHERE col2=val2;
    SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3;
     
    如果 (col1,col2,col3)有一个索引,只有前2个查询使用索引。第3个和第4个查询确实包括索引的列,但(col2)和(col2,col3)不是 (col1,col2,col3)的最左边的前缀。