我需要帮助。我有这样的疑问:
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不使用索引。任何帮助?
答案 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;