gpt4 book ai didi

MySQL 连接查询不使用索引?

转载 作者:行者123 更新时间:2023-11-30 23:29:33 25 4
gpt4 key购买 nike

我有这个问题:

SELECT 
COUNT(*) AS `numrows`
FROM (`tbl_A`)
JOIN `tbl_B` ON `tbl_A`.`B_id` = `tbl_B`.`id`
WHERE
`tbl_B`.`boolean_value` <> 1;

我为 tbl_A.B_idtbl_B.idtbl_B 添加了三个索引code>.boolean_value 但 mysql 仍然说它不使用索引(在不使用索引日志的查询中)并且它检查整个表以检索结果。

我需要知道我应该做什么来优化这个查询。

编辑:

解释输出:

id  select_type table  type  possible_keys          key   key_len  ref      rows  Extra 
1 SIMPLE tbl_B ALL PRIMARY,boolean_value NULL NULL NULL 5049 Using where
1 SIMPLE tbl_A ref B_id B_id 9 tbl_B.id 9 Using where; Using index

最佳答案

解释向我们展示了索引用于连接到 tbl_B 但没有索引用于根据 bool 值过滤 tbl_A。

索引可用,但引擎选择不使用它。为什么会这样:

  • 也许 5049 行不是什么大问题,引擎发现使用索引过滤大约 10% 使用索引的行与不使用它一样快
  • bool 值只有 3 个值:1、0 或 NULL。因此,索引的基数总是很低(最大 3)。低基数索引通常被查询分析器丢弃(这是很正确的,通常认为这个索引不会对他有太大帮助)

当您将此 bool 值的 true 和 false 值按 50/50 重新分配时,或者当您只有几个 False 时,看看查询分析器的行为是否相同会很有趣。

现在通常 bool 字段仅对包含多个键的索引有用,因此如果您的查询使用索引的所有字段(在 where 或 order by 中),查询分析器将相信该索引确实是一个很好的工具。

请注意,索引会减慢您的写入速度并占用额外空间,请勿添加无用的索引。使用 logt-query-not-using-indexes 是一件好事,但您应该用慢查询日志补偿该日志信息。如果查询很快,这不是问题。

关于MySQL 连接查询不使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com