复合索引 - 从左到右并且不跳过不被尊重

问题描述 投票:0回答:1

我有以下综合指数

(列及其类型)

pet_id - 可为 null 的整数

barn_id - 可为 null 的 int

生日 - 可为空的日期时间

my_index(pet_id, barn_id, 生日, 姓名)

我有以下疑问

WHERE pet_id = 5 AND barn_id = 5 AND gender = 0 AND birthday = '2023-12-31 15:00:00'

此查询生成的 key_len 总计为 16,即 pet_id(5)、barn_id(5) 和birthday(6),这很奇怪,因为我在生日之前有列性别条件。为什么到生日为止它仍然使用复合索引而不是仅 pet_id 和 barn_id ?

我尝试使用解释和分析查询,但仍然不明白为什么会发生这种情况。

mysql indexing mysql-workbench
1个回答
0
投票

应用于查询中的 gender 列的条件会阻止复合索引得到充分利用,因为该列位于索引的最后。因此,复合索引的顺序与查询的顺序并不完全一致,从而导致意外的结果。要优化索引,您可以考虑为性别列创建单独的索引。这样,虽然单独的索引可用于查询中的“性别”条件,但复合索引仍可用于其他条件,从而可能提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.