mysql - 将索引与范围类型查询和其他条件一起使用

标签 mysql indexing

我需要这方面的帮助。我有这样的查询:

SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199);

上面的查询在 ts_in 列(范围类型)上使用 btree 索引。现在我想为此添加另一个标准。例如:

SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;

上面的查询没有在 ts_in 列(范围)上使用 btree 索引。

有人能告诉我为什么以及我怎样才能以正确的方式进行快速计算。

我创建了两个用于测试的索引:

CREATE INDEX range_idx_1 using BTREE
ON cart (is_removed, ts_in);

CREATE INDEX range_idx_2 using BTREE
ON cart (ts_in , is_removed);

有趣的是,当我使用这个查询时:

EXPLAIN SELECT id FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) AND is_removed=0;

我收到了这个结果:

id | select_type | table | type  | possible_keys           | key         | key_len | ref | rows  | Extra 
1  | SIMPLE      | cart  | range | range_idx_1,range_idx_2 | range_idx_1 | 6       |     | 17391 | Using where; Using index

上面的查询使用了索引但是:

EXPLAIN SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) AND is_removed=0;

我有这样的结果:

id | select_type | table | type  | possible_keys           | key         | key_len | ref   | rows  | Extra 
1  | SIMPLE      | cart  | ref   | range_idx_1,range_idx_2 | range_idx_1 | 1       | const | 77979 | Using where

这不使用索引。

当我尝试使用 USE INDEX 或 FORCE INDEX 语法时,结果是一样的。在一种情况下,Mysql 不使用索引。有什么帮助吗?

最佳答案

运行一个

EXPLAIN SELECT * FROM cart WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;

看看为什么mysql查询优化器选择了不同的索引。

Mysql 本身并不擅长组合索引,因此您可能需要为该查询使用组合索引。尝试为 is_removed, ts_in 添加索引(btree?)(按此顺序!)。

您还可以通过在查询中添加一个 USE INDEX 来强制 mysql 使用您的索引。有时这会作为查询优化器选择的索引提供更好的结果:

SELECT * FROM cart USE INDEX '<idx_name>' WHERE
(ts_in between 1249077600 AND 1318975199) and is_removed=0;

关于mysql - 将索引与范围类型查询和其他条件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7803627/

相关文章:

MySQL 如何选择获取特定状态,如果不符合要求状态,则如何获取最后一个 ID?

c# - 由于 KeyNotFoundException,无法连接到 MySQL 数据库

php - MYSQL/Laravel : convert a WHERE into a variable

mysql - 找出 MySQL 索引的使用统计信息?

c# - 等同于 C# 中枚举类型的索引?

MySQL合并两列并添加到一个新列中

php - 源码安装 Apache 2.2.13 + PHP 5.3 + Snow Leopard

C++ - 当您用 float 索引数组时会发生什么?

c++ - 在C++中向数组添加索引和指定数字

mysql - 存储/索引之前的 REVERSE() 电子邮件地址,或不?