日期范围内搜索查询的最佳MySQL索引

时间:2015-01-14 16:40:34

标签: mysql indexing

我有一个表格

的MySQL表格
CREATE TABLE `myTable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` datetime NOT NULL,
  `fieldA` int(11) NOT NULL,
  `fieldB` int(11) NOT NULL,
....
) 

该表将有大约500,000,000行,其余字段为浮点数。

我将使用的查询形式为:

SELECT * FROM myTable 
WHERE fieldA= AND fieldB= AND timestamp>'' and timestamp<='' 
ORDER BY timestamp;

目前我有两个索引:id上的主键,时间戳上的唯一键,fieldA,fieldB(哈希)。目前,在功能相当强大的台式PC上,上述选择查询大约需要6分钟。

最佳指数适用于什么?密钥中3个字段的排序是否重要,我应该使用二叉树而不是散列?我的主键和第二个索引之间是否存在冲突?或者,如果没有更严重的硬件,我能在这么大的数据库中获得最佳性能吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

散列索引不用于范围。它们仅用于相等比较。因此,散列索引不能用于查询的范围部分。

由于查询中有一个范围,因此应使用标准的b树索引。确保fielda和fieldb是索引中的第一列,然后是时间戳。 MySQL不能将索引用于第一个范围之外的搜索。

考虑(fielda, fieldb, timestamp)上的多列索引。

索引也应该能够满足ORDER BY

要进一步改进查询,请仅选择这三列或考虑更大的&#34;覆盖&#34;索引。

答案 1 :(得分:3)

对于该特定查询,向fieldAfieldB添加索引可能是最佳的。索引中列的顺序很重要。

指数订单

为了让Mysql甚至考虑在查询中使用特定索引,第一列必须在查询中,例如:

alter table mytable add index a_b_index(a, b);

select * from mytable where a = 1 and b = 2;

上述查询应使用索引a_b_index。现在来看下一个例子:

alter table mytable add index a_b_index(a, b);

select * from mytable where b = 2;

这不会使用索引,因为索引以a开头,但a从未在查询中使用,因此mysql不会使用它。

<强>比较

如果使用相等比较,Mysql将仅使用索引。因此,<>不会使用该列的索引,与between相同

<强> LIKE

Mysql确实使用了LIKE语句中的索引,但只有当%位于语句末尾时才会这样:

select * from mytable where cola like 'hello%';

虽然这些不会使用索引:

select * from mytable where cola like '%hello';
select * from mytable where cola like '%hello%';