组合索引中哪些字段还需要创建索引

img

img

给evaluation创建组合索引multi_index,顺序是product_id,user_id,mcn_id ,这个表一共有四个索引,
因为product_id满足最左匹配原则,就不需要再给product_id创建索引了,可以给user_id,mcn_id创建索引吧?

EXPLAIN SELECT * from evaluation WHERE id =2 -- 走主键索引
EXPLAIN SELECT * from evaluation WHERE product_id =2 -- key=multi_indix,type=ref
EXPLAIN SELECT * from evaluation WHERE user_id =2 -- type=all
EXPLAIN SELECT * from evaluation WHERE mcn_id =2 -- type=all

在您提供的数据中,执行了三个 EXPLAIN SELECT 语句来分析查询计划的类型。这些查询使用了不同的索引,并产生了不同的结果。

第一个 EXPLAIN SELECT 语句使用了主键索引,结果为 type=ref。

第二个 EXPLAIN SELECT 语句使用了组合索引 multi_index,结果为 type=range。这表明该索引适用于带有 product_id 条件的查询。

第三个和第四个 EXPLAIN SELECT 语句分别使用了 user_id 和 mcn_id 索引,结果为 type=all。这表明没有适用的索引来支持这些查询,表必须被完全扫描以执行查询。因此,为了提高查询效率,您可以考虑为这两个字段创建单独的索引。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    从你给出的信息来看,我们并不能明确回答需要哪些字段创建索引,因为这需要根据具体的查询需求来确定。但是,我们可以给出一些建议来帮助你决定。

    通过你提到的最左匹配原则,我们可以知道如果查询条件中包含了索引的前缀字段,那么这个索引就可以被使用。因此,对于你创建的这个组合索引multi_index,如果查询中需要使用的条件是由product_id开始的,那么这个组合索引就可以被使用。如果查询需要使用的条件是由user_id或者mcn_id开始的,那么这个索引就不能被使用,需要单独再为这两个字段创建索引。

    另外,如果查询中出现了需要使用的字段没有被覆盖到的情况,那么就需要再为这些字段创建单独的索引。但是具体需要创建哪些索引,还是需要结合你的业务需求来确定。

    最后,需要注意的是,要避免过多地创建索引,因为索引会占用额外的空间,对写入性能也会有一定的影响。因此,需要在保证查询性能的前提下,尽量减少索引的数量。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^