表结构如下:CREATE TABLE `order` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` int(10) unsigned NOT NULL,
  `price` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `price` (`price`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8情况1:
explain select userid, price from `order` o where (o.price>95 and o.price<100);
显示没有索引被用到。这种情况下,如果我把索引改为price+userid,就显示用到这个索引了情况2:
explain select price from `order` o where (o.price>95 and o.price<100);
显示price被用来做索引情况3:
explain select userid, price from `order` o where o.price=95;
也显示price被用来做索引我就觉得奇怪,为什么情况1没用到索引?

解决方案 »

  1.   


    这个主要看成本,mysql的优化器会判断每个sql的大致开销,也就是成本。用索引的开销是多少,不用索引的开销是多少,那个开销少,就用那个执行计划,所以就会出现你上面的差异。但要注意的是这个过程只是预测,是mysql根据一些基本的信息来预测各种执行计划(用索引的执行计划,不用索引的执行计划),比如:预计返回的记录数,记录的平均长度,数据的分布等等。
      

  2.   

    因为范围扫描了索引  还需要再取正行记录来过滤userid 
    mysql认为这样的代价不如直接全表扫描来的快