gpt4 book ai didi

MySQL 在检查 = 1 时不使用索引,而是将其与 = 0 一起使用

转载 作者:可可西里 更新时间:2023-11-01 07:12:07 24 4
gpt4 key购买 nike

这是我遇到的一个令人困惑的问题:

Query:
EXPLAIN SELECT id,hostname FROM queue_servers WHERE live=1

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE queue_servers ALL live NULL NULL NULL 6 Using where

Query:
EXPLAIN SELECT id,hostname FROM queue_servers WHERE live=0

id select_type table type possible_keys key key_len ref rows Extra

1 SIMPLE queue_servers ref live live 1 const 1

SHOW INDEXES FROM queue_servers

Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type

queue_servers 1 live 1 live A 6 NULL NULL BTREE

有什么想法吗?这让我发疯了。如果我只是尝试像这样选择一个列:

EXPLAIN SELECT id FROM queue_servers WHERE live=1

它工作得很好..但是如果我尝试选择“主机名”列,或将其添加到选择列列表中,除非我正在搜索 live=0 否则它不会使用实时索引..为什么这个?

最佳答案

为什么MySQL不使用索引?
如果 很大百分比 的行具有该值,MySQL 将不会使用索引。

为什么在查询中添加use index在这里不起作用
添加 use index 子句不会有任何效果,因为 use index 只会建议使用哪个索引,不会建议是否使用一个索引索引与否。

使用少行测试表时的注意事项
当使用只有几行的测试表时,这尤其令人烦恼,因为 MySQL 将拒绝使用索引,并且很难看出您的查询有什么问题。
因此,请确保向测试表添加足够的行以使其成为真实的测试。

在低基数列上使用索引没用吗?
bool 列的索引并不像您在问这个问题之前想的那样有用
然而,它也不是无用
使用 InnoDB MySQL 将尽可能尝试使用索引检索数据,如果您的 bool 字段有索引查询:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

可以读取bool_field的覆盖索引中的所有数据,因为InnoDB中的二级索引总是包含主索引(id)
这更快,因为 MySQL 不必将整个表读入内存。

在 MyISAM 中这不起作用,MySQL 将检查整个表。

但我可以使用force index
您可以,但是在低基数索引上,它会使您的查询变慢,而不是变快。只覆盖复杂查询的索引,并且如果您知道 MySQL 用于选择索引的规则。

链接:
请参阅:http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html
和:http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

如果你想要一本关于这个主题的书:阅读
高性能 MySQL:http://oreilly.com/catalog/9780596003067

关于MySQL 在检查 = 1 时不使用索引,而是将其与 = 0 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6084460/

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