首页 新闻 会员 周边

MQSQL索引问题

0
悬赏园豆:30 [已解决问题] 解决于 2023-11-08 10:01

ALTER TABLE product_on_sale ADD INDEX release_use_index (release_id,use_id);
ALTER TABLE product_on_sale ADD INDEX release_index (release_id);
当前表没有主键,在实际场景中,使用到release_id进行查询或删除时,使用的是第一个索引release_use_index ,还是第二个索引release_index

DHaiLin的主页 DHaiLin | 菜鸟二级 | 园豆:221
提问于:2023-11-07 15:42

当提出这个疑问的时候,其实也就知道了结果,但是不知道原因

DHaiLin 5个月前
< >
分享
最佳答案
1

这种自己写个test表就可以了,然后按照你的要求把索引创建好,用msql的explain分析一下就找到了,猜测是走组合索引,因为触发最左原则了。
简单建个表试了试:
CREATE TABLE test (
id INT(11),
name VARCHAR(25),
type VARCHAR(25)
);

ALTER TABLE test ADD INDEX id_name_index (id,name);
ALTER TABLE test ADD INDEX id_index (id);

insert into test values(1,"nnn","type1");
insert into test values(2,"nnn2","type2");

explain SELECT * from test where id=1;

结果:
id select_type table partitions type possible_keys key key_len ref rows filtered extra
1 SIMPLE test ref id_name_index,id_index id_name_index 5 const 1 100
结果符合预期,key表示走的哪个索引(explain 结果字段什么意思可以自己研究一下)。

补充:
从上面的结果可以看出联合索引和单列索引的选择上还是尽量根据业务创建联合索引,这样节省索引的开销,索引是要占用资源的,太多的单列索引是不必要的开销(如果我创建了id,name的联合索引我在用id查询的时候实际上这个索引也是有用的,最左原则),另外就是如果我要用id,name做索引的时候不是说我以id,name分别建立两个单列索引就是有用的,实际上这两个索引不会一起生效,还是要建立一个联合索引

收获园豆:30
一腿狗毛 | 菜鸟二级 |园豆:326 | 2023-11-07 17:07
其他回答(2)
1

在给定的情况下,如果你执行针对 release_id 的查询或删除操作,数据库系统会选择使用索引的方式需要依赖于查询的具体条件以及优化器的判断。

当查询中涉及到使用 release_id 和 use_id 的条件时,release_use_index (release_id, use_id)这个组合索引可能会被选择,因为索引的覆盖度更好。也就是说,它可以更有效地执行相关查询,特别是涉及到 release_id 和 use_id 这两列的查询。

如果查询只涉及到 release_id 这一列,数据库优化器可能更倾向于选择使用 release_index (release_id),因为它更简单,不需要额外考虑 use_id,因此在这种情况下可能更高效。

数据库优化器会根据查询的条件、表的数据分布、索引的统计信息以及成本估算等因素来选择最佳的执行计划。优化器的目标是选择最有效的索引或执行方式来提供最快的查询响应时间。

路小乙 | 园豆:469 (菜鸟二级) | 2023-11-07 17:09
1

单列索引、组合索引
https://zzk.cnblogs.com/s/blogpost?w=组合索引

第二个索引 release_index 没有必要建立。
建立第一个后,可以用 SHOW INDEX 查看下,此时,第二个已经有了。

快乐的凡人721 | 园豆:3922 (老鸟四级) | 2023-11-07 17:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册