最有效的查询来获取大表中的最后修改记录

时间:2014-07-06 13:04:42

标签: mysql sql

我有一张包含大量记录(> 300,000)的表格。表中最相关的字段是:

  • CREATE_DATE
  • MOD_DATE

每次添加或更新记录时都会更新。

我现在需要查询此表以查找最后修改过的记录的日期。我目前正在使用

SELECT mod_date FROM table ORDER BY mod_date DESC LIMIT 1;

但我想知道这是否是获得答案的最有效方式。

我已经尝试添加where clause来限制上个月的日期,但看起来实际上速度较慢(而且我需要最近的日期,可能比上个月)。

我也尝试过我在其他地方读到的建议:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'db'
   AND TABLE_NAME = 'table';

但是因为我可能正在处理原始转储,该查询可能会导致NULL。它看起来实际上比原始查询慢。

我无法使用last_insert_id(),因为我没有更新或插入。

我只想确保尽可能提供最有效的查询。

3 个答案:

答案 0 :(得分:2)

此查询最有效的方法是使用列MOD_DATE的索引。

来自How MySQL Uses Indexes

  

8.3.1 MySQL如何使用索引   索引用于快速查找具有特定列值的行。   如果没有索引,MySQL必须从第一行开始然后读取   通过整个表来查找相关的行。越大了   表,这个成本越多。如果表具有列的索引   有问题的是,MySQL可以快速确定要寻求的位置   数据文件的中间,而不必查看所有数据。如果   一个表有1000行,这比阅读快至少100倍   顺序。

您可以使用

SHOW CREATE TABLE UPDATE_TIME;

获取CREATE语句并查看是否定义了MOD_DATE上的索引。

要添加索引,您可以使用

CREATE INDEX

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    [index_type]
    ON tbl_name (index_col_name,...)
    [index_option]
    [algorithm_option | lock_option] ...

请参阅http://dev.mysql.com/doc/refman/5.6/en/create-index.html

答案 1 :(得分:1)

使用EXPLAIN:

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

这告诉你mysql如何执行语句,这要归功于你可以找出最有效的方法,因为它取决于你的db结构,并且没有一个通用的解决方案。

答案 2 :(得分:1)

确保将这两个字段编入索引。

然后我会跑 -

select max(mod_date) from table

或create_date,无论哪一个。

确保创建2个索引,每个日期字段一个,而不是两者上的复合索引。

关于此限制与使用限制之间差异的讨论,请参阅MIN/MAX vs ORDER BY and LIMIT