mysql查询--不走索引

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字段显示的就是索引的基数

https://blog.csdn.net/jiangqingyao/article/details/90291069

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值