使用带范围类型查询和其他条件的索引

时间:2011-10-18 07:09:11

标签: mysql indexing

我需要帮助。我有这样的疑问:

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

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

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

上述查询不使用ts_in colomn(范围)上的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

这不使用索引。

当我尝试使用INDEX或FORCE INDEX语法时,结果是相同的。在一个案例中,Mysql不使用索引。任何帮助?

1 个答案:

答案 0 :(得分:1)

运行

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;