explain 关于 order by 与索引(二)
2014-05-15 20:52
127 查看
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 这两个字段也没用到 单列索引,一次查询只能用到 一个单列索引 。 选最优的。
`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 这两个字段也没用到 单列索引,一次查询只能用到 一个单列索引 。 选最优的。
相关文章推荐
- explain 关于 order by 与索引
- 关于order by与索引的建立问题
- 使用Explain关键字来确认是否可以通过索引来解决Order BY速度问题。
- Explain的type, where 和 order by 组合是索引的选择
- 关于MySQL数据库索引和ORDER BY子句的使用问题简介
- 关于索引的理解(一)
- 关于sql server建立索引需要注意的问题
- 问几个问题,关于p2p搜索和分布式索引还有.net无框架打包的问题
- 关于sql server建立索引需要注意的问题
- 关于sql索引的问题
- 关于Microsoft索引服务的提问
- 关于对视图创建索引的一些问题
- 关于lucene断点续索引和增量索引的问题
- 关于SQL Server中索引使用及维护简介
- 关于lucene断点续索引和增量索引的问题
- 关于聚集索引的工作体会
- 关于数据库的索引
- 关于索引一些用法介绍(db2)
- 关于Microsoft索引服务设计
- 关于SQL SERVER建立索引需要注意的问题