Chinaunix

标题: mysql索引问题 [打印本页]

作者: Ophelia_cu    时间: 2013-10-14 21:18
标题: mysql索引问题
     create table t_a(id int
                             id1 varchar(30),
                             idname varchar(30),
                             id2 varchar(30),
                             id2name varchar(30))


有两个查询

select * from t_a where id1=? and idname=?;

select * from t_a where id1=? and idname=? and id2=? and id2name=?;


这时我建两个索引
create idx_t_a_01 on t_a(id1,idname);
create idx_t_a_02 on t_a(id1.idname,id2,id2name)

第二个查询为什么 不走索引 idx_t_a_02  而走 索引 idx_t_a_01 呢?

索引的字段顺序 和where后面的字段顺序有关吗?
作者: bikong0411    时间: 2013-10-15 09:28
第二个索引包含第一个索引,mysql使用第二个索引能对这几个字段全使用索引,mysql的执行计划就选择了第二个索引
作者: seesea2517    时间: 2013-10-15 10:31
索引的选择有点复杂,跟表数据大小都有关系呢。
作者: a.a    时间: 2013-10-15 10:32
从你的建的索引idx_t_a_01   idx_t_a_02  内容来看idx_t_a_01   是02的冗余索引。也就是01是02的一个前缀索引,在我的测试环境中类似于你的第二查询
使用的是02索引。
index 和where里面字段的顺序我认为关系不大,关键是在看你的index字段和你where条件中所使用的字段。在b-tree index中有一个最左原则,就是查询条件中如果有索引的最左字段(前提是查询的写法必须符合 索引的要求),这个查询就可以使用索引。
      在你的index中,最左的字段就是id1.你可以尝试几个查询,查询条件中不带有id1,你会发现你的查询会进行全表扫描。
作者: 幕南风    时间: 2013-10-18 00:00
根据复合索引的前缀性原理,只要where谓词里面有出现索引前导列,那么该索引就有可能被用上




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2