我有一个表格
的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个字段的排序是否重要,我应该使用二叉树而不是散列?我的主键和第二个索引之间是否存在冲突?或者,如果没有更严重的硬件,我能在这么大的数据库中获得最佳性能吗?
谢谢!
答案 0 :(得分:3)
散列索引不用于范围。它们仅用于相等比较。因此,散列索引不能用于查询的范围部分。
由于查询中有一个范围,因此应使用标准的b树索引。确保fielda和fieldb是索引中的第一列,然后是时间戳。 MySQL不能将索引用于第一个范围之外的搜索。
考虑(fielda, fieldb, timestamp)
上的多列索引。
索引也应该能够满足ORDER BY
。
要进一步改进查询,请仅选择这三列或考虑更大的&#34;覆盖&#34;索引。
答案 1 :(得分:3)
对于该特定查询,向fieldA
和fieldB
添加索引可能是最佳的。索引中列的顺序很重要。
指数订单
为了让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%';