explain 关于 order by 与索引(二)

本文深入探讨了SQL查询中的索引应用及其对查询效率的影响,包括如何使用索引来加速查询过程,以及如何理解SQL查询优化器如何选择并利用索引来提升性能。通过具体例子分析了索引创建、索引类型、索引使用场景和优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create table if not exists log_role_gold_change(

`id` int(11) primary key auto_increment,

`username` varchar(60) character set utf8 not null,

`roleid` int(11) not null,

`newcount` int(11) not null,

`create_time` int(11) not null,

`type_str` varchar(25) character set utf8 not null



)engine=myisam deafult charset = utf8;

表总共有:2,020,064条数据;

alter table log_role_gold_change add index(`reason`,`create_time`,`username`);

图1:


从第一个sql  和第二个sql看出,如果在第一个索引字段条件为固定字符串时,order by  后面的字段 如果和order by  后面的索引字段符合 最左前缀的话就会生效(可以用到索引)

第一个sql: 查询where  的字句reason时,用到了 组合索引(reason_2) 查询时连接类型为 ref  :  extra :  using where 为查询where 字句时用到了固定的常量查询条件,using index 为 :这个字句的条件用到了索引。总体查询效率:为优

第二个sql :查询where  的字句reason时,用到了 组合索引(reason_2) 查询时连接类型为 ref  :  extra :  using where 为查询where 字句时用到了固定的常量查询条件,using index 为 :这个字句的条件用到了索引,根据where 字句条件获取了索引所对应的数据,(执行这些时效率为:优)。但是当 排序时,由于where 字句的字段和 这两个字段不符合组合索引的 最左索引条件。所以排序时时没有通过索引去排序,而是通过字段去表里找对应的数据来排序。所以总体效率:差。


图2:


这个图从第一个sql可以看出:如果 order by  后面的索引字段如果 排序不同的话,这两个字段也不会用到索引

图3:

可以看出如果order by  字段里有一个字段不是索引的话 最后效率还是较差 (但是 比图2的 第一条sql的效率要稍微好点,因为他会在 type_str字段时,才会从文件中进行排序【也就是 去表里找数据排序】) 从 rows  字段可以看出来

图4:

可以看出  如果用where 字句里 的字段有多个等于条件  ,order by  会认为 他是一个范围查询(返回查询:>        <     <>    >=   =< ),所以order by 里的字段不会用到索引。

图5:

alter table log_role_gold_change add index(`reason`);


如果加了一个reason 单列索引的话

从第一个sql看出,虽然possible_keys  显示了 可能要用到的索引,但实际 用到的事reason_2,这是因为 这个sql 里优先符合了 组合索引,【图1:解释了】

从第二sql 看出 如果不符合组合索引 才会去用 单列索引 。

图6:

在增加两个单列索引:

可以看出  虽然没有用到 组合索引,但是 order by  这两个字段也没用到 单列索引,一次查询只能用到 一个单列索引  。  选最优的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值