我有一张包含大量记录(> 300,000)的表格。表中最相关的字段是:
每次添加或更新记录时都会更新。
我现在需要查询此表以查找最后修改过的记录的日期。我目前正在使用
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()
,因为我没有更新或插入。
我只想确保尽可能提供最有效的查询。
答案 0 :(得分:2)
此查询最有效的方法是使用列MOD_DATE
的索引。
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] ...
答案 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