我想加速一个MySQL查询,它基本上按照下面的模式检索一页数据
select
my_field_A,
my_field_B
where
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
字段time_id
是一个MySQL索引,但是,查询的行为就像在每个查询中读取整个数据库一样(检索几行已经非常慢)。我不是MySQL的专家。有人可以猜出我做错了吗?
答案 0 :(得分:3)
确保在time_id上有一个索引(B树),这应该对范围查询有效。还要确保time_id采用适当的时间格式。
如果你真的想了解mysql正在做什么,你可以在查询的前面添加关键字'explain'并在你的mysql客户端中运行它。这将显示有关mysql正在执行的操作以及执行何种扫描的一些信息。
答案 1 :(得分:1)
由于可能有很多time_id
属于这些标准,MySQL
可能会认为全表扫描更好。
尝试强制索引:
SELECT
my_field_A,
my_field_B
FROM mytable FORCE INDEX (index_name_on_time_id)
WHERE
time_id >= UNIX_TIMESTAMP('1901-01-01 00:00:00') AND
time_id < UNIX_TIMESTAMP('2009-01-16 00:00:00')
答案 2 :(得分:0)
你需要更低的范围吗?有没有比1901年更早的参赛作品? time_id列是如何生成的?如果每个新条目都添加到DB中时time_id总是更大,您可能需要考虑查找最接近2009-01-16条目的ID,然后按ID选择
select my_field_A, my_field_B
FROM
mytable
WHERE
id <= ?
如果情况并非如此,请尝试检查MySQL 5.1中提供的分区并按年分解表格,这样可以大大提高速度。