1、表结构
CREATETABLE `student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`age` int(11) DEFAULT 0,
`name` varchar(16) DEFAULT "",
key idx_age (`age`),
key idx_name (`name`),
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
2、不走索引情况
(1)查询条件在索引列上使用函数操作,或者运算的情况
以下case是不走索引的
explain select * from student where abs(age) =18;
explain select * from student where age + 1=18;
(2)查询条件字符串和数字之间的隐式转换
例如:name与age分别做字符串/数字(88)的隐式转换;
以下case走索引情况:
explain select * from student where name =’88’;
explain select * from student where age='88';
explain select * from student where age =88;
以下case不走索引情况:
explain select * from student where name=88;
(3)特殊修饰符 %%, Or 将不走索引
explain select * from student where name like'%name%' ;
explain select * from student where name ='name' or age = 18;
3、不走索引原理
索引优化器选择最优的索引
索引到底用不用,不是列加了索引就一定会用
,而是根据索引优化器
来决定。
索引优化器的存在,就是找到一个索引扫描行数最少
的方案去执行语句。那么扫描行数怎么来判断的?是逐行统计数据表的数据吗?其实并不是,而是根据统计信息来估算的值
。这个统计信息就是我们常说的索引的“区分度
”。
显然,一个索引上不同的值越多
,这个索引的区分度
就越好
。我们把一个索引上不同的值的个数,称之为“索引基数”
。也就是说,基数越大,索引的区分度就越好,执行查询的行数就越少
。如何查看索引基数呢?使用 show index from 表名
,cardinality字段
显示的就是索引的基数
。