MySQL中的快速页面检索,索引用法?

时间:2009-03-02 16:44:52

标签: mysql performance indexing paging

我想加速一个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的专家。有人可以猜出我做错了吗?

3 个答案:

答案 0 :(得分:3)

确保在time_id上​​有一个索引(B树),这应该对范围查询有效。还要确保time_id采用适当的时间格式。

如果你真的想了解mysql正在做什么,你可以在查询的前面添加关键字'explain'并在你的mysql客户端中运行它。这将显示有关mysql正在执行的操作以及执行何种扫描的一些信息。

http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

答案 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中提供的分区并按年分解表格,这样可以大大提高速度。