gpt4 book ai didi

mysql - 如何让Mysql对 'where'中的一元条件选择使用索引

转载 作者:行者123 更新时间:2023-11-29 16:47:00 25 4
gpt4 key购买 nike

我在 Ruby on Rails 应用程序中有一个查询,其中有一个奇怪的一元条件:

SELECT * FROM messages WHERE (active)  ORDER BY id DESC;

我什至不知道允许这样的条件,并且在任何地方都找不到描述此语法的文档。实验表明,这在某种程度上相当于

SELECT * FROM messages WHERE active!=0  ORDER BY id DESC;

问题在于 Mysql 仅对第二个变量使用索引:

mysql> explain SELECT * FROM messages WHERE (active)  ORDER BY id DESC;
+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+
| 1 | SIMPLE | messages | ALL | NULL | NULL | NULL | NULL | 560646 | Using where; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+--------+-----------------------------+


mysql> explain SELECT * FROM messages WHERE active!=0 ORDER BY id DESC;
+----+-------------+----------+-------+------------------+--------+---------+------+------+---------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+------------------+--------+---------+------+------+---------------------------------------+
| 1 | SIMPLE | messages | range | active_id,active | active | 2 | NULL | 1394 | Using index condition; Using filesort |
+----+-------------+----------+-------+------------------+--------+---------+------+------+---------------------------------------+

我无法更改查询文本,因为正如向我解释的那样,应用程序会动态生成查询,并且它们不会存储在任何地方。所以我的问题是:

  1. 我是否正确理解了这个一元子句的含义?
  2. 为什么此类查询不使用索引?
  3. 是否可以让 Mysql 在不更改查询文本的情况下使用此索引?

最佳答案

  1. 你是对的,两个子句应该有相同的结果(假设是 int 类型)。

  2. 服务器代码似乎无法识别等效项。在 MySQL-8.0 上进行测试,存在相同的查询计划。 MariaDB-10.2 和 10.3 似乎都在这两种情况下使用索引。

  3. 没有。

如果active中的值范围是0或1;如果 idSELECT * FROM messages WHERE active=1 ORDER BY id DESC 查询将能够使用索引进行排序(因此没有 filesort) code> 是主键;

关于mysql - 如何让Mysql对 'where'中的一元条件选择使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53037448/

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