您的位置:首页 > 大数据 > 人工智能

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  这两个字段也没用到 单列索引,一次查询只能用到 一个单列索引  。  选最优的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: