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