一个表,有一个isdel字段,标识此条数据是否删除,在此字段建立索引。
此字段类型为tinyint,默认值为0。
alter table table_name add index table_name_isdel(isdel);
sql为
select * from table_name where isdel = 0;
explain结果为
sql为
select * from table_name where isdel = 1;
explain结果为:
两个sql的区别只有isdel的条件值不同,但是为何explain结果不同呢?
另外,isdel=0的情况为多数,为1的情况为少数,是否这个原因导致的?如果是,如何解决呢?
感激不尽!!!
这个是因为mysql内部的优化机制引起的
当查询需要访问绝大部分记录时,mysql会使用全表扫描而不是索引,因为查询索引也是需要时间的
根据你的描述,你的数据表中大部分的记录isdel=0,所以mysql认为全表扫描优于使用索引
跟楼上提到的一样
另外,不建议滥用索引,过度的使用索引反而会导致性能降低
应该为维度高的列创建索引,类似性别这种低纬度的列不适合使用索引