1

我想加快一个基本上按照以下模式检索数据页面的 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 专家。有人能猜到我做错了什么吗?

4

3 回答 3

3

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

如果您真的想了解 mysql 在做什么,您可以在查询前面添加关键字“解释”并在您的 mysql 客户端中运行它。这将显示一些关于 mysql 正在做什么以及执行什么样的扫描的信息。

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

于 2009-03-02T16:48:34.963 回答
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')
于 2009-03-02T16:48:19.037 回答
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 中可用的分区并按年分解表,这应该会显着提高速度。

于 2009-03-03T13:14:43.767 回答