在包含1500000行的MySql表上运行下面的选择大约需要5分30秒。MySql转换问题:从UNIX_TIMESTAMP到INT(11)
SELECT * FROM my_table WHERE timestamp BETWEEN UNIX_TIMESTAMP('2008-04-23 01:37:02') AND UNIX_TIMESTAMP('2008-04-23 01:37:03')
[Executed: 25/01/10 5:32:47 EST PM ] [Execution: 231094/ms]
转换和更换通过UNIX_TIMESTAMP功能在上面的查询所返回的值将显着地降低的持续时间:
SELECT UNIX_TIMESTAMP('2008-04-23 01:37:02'), UNIX_TIMESTAMP('2008-04-23 01:37:03')
UNIX_TIMESTAMP('2008-04-23 01:37:02') UNIX_TIMESTAMP('2008-04-23 01:37:03')
---------------------------------------- ----------------------------------------
1208911022 1208911023
SELECT * FROM my_table WHERE timestamp BETWEEN 1208911022 AND 1208911023
[Executed: 25/01/10 5:58:27 EST PM ] [Execution: 11875/ms]
的类型时间戳列是INT(11) 。
我们在这里不讨论索引 - 我不是数据库的所有者,但我会要求索引该列。
我想问你为什么两个查询之间的时间差异很大?
似乎从时间戳列每INT(11)值转换为通过UNIX_TIMESTAMP返回值的类型!
更新1
MySQL版本:
SELECT VERSION()
5.1.23-rc-log
解释结果:
EXPLAIN SELECT * FROM my_table WHERE timestamp BETWEEN UNIX_TIMESTAMP('2008-04-23 01:37:02') AND UNIX_TIMESTAMP('2008-04-23 01:37:03')
id select_type table type possible_keys key key_len ref rows Extra
----- -------------- ------------- ------- ---------------- ------ ---------- ------ -------- -----------
1 SIMPLE my_table ALL (null) (null) (null) (null) 15046061 Using where
EXPLAIN SELECT * FROM my_table WHERE timestamp BETWEEN 1208911022 AND 1208911023
id select_type table type possible_keys key key_len ref rows Extra
----- -------------- ------------- ------- ---------------- ------ ---------- ------ -------- -----------
1 SIMPLE my_table ALL (null) (null) (null) (null) 15046061 Using where
UPDATE 2
SELECT * FROM my_table WHERE timestamp >= UNIX_TIMESTAMP('2008-04-23 01:37:02') AND timestamp <= UNIX_TIMESTAMP('2008-04-23 01:37:03')
[Executed: 26/01/10 10:29:52 EST AM ] [Execution: 264172/ms]
EXPLAIN SELECT * FROM my_table WHERE timestamp >= UNIX_TIMESTAMP('2008-04-23 01:37:02') AND timestamp <= UNIX_TIMESTAMP('2008-04-23 01:37:03')
id select_type table type possible_keys key key_len ref rows Extra
----- -------------- ------------- ------- ---------------- ------ ---------- ------ -------- -----------
1 SIMPLE my_table ALL (null) (null) (null) (null) 15046061 Using where
似乎> =和< =未进行任何差别 - 运行时间超过5分钟!
请将'EXPLAIN SELECT * FROM my_table WHERE时间戳BETWEEN UNIX_TIMESTAMP('2008-04-23 01:37:02')和UNIX_TIMESTAMP('2008-04-23 01:37:03')'的结果和'解释SELECT * FROM my_table WHERE timestamp BETWEEN 1208911022 AND 1208911023'。这会告诉你正在使用哪些索引。 MySQL *很可能不会*在第一个查询中使用索引,* * *在第二个查询中使用索引。 – Asaph 2010-01-25 23:13:35
增加了EXPLAIN计划和MySQL版本。 – 2010-01-26 15:47:40
感谢您发布'EXPLAIN'语句的结果。现在我可以看到没有索引被使用。你可以发布'SHOW CREATE TABLE my_table'的结果吗?'所以我们可以看到表上有什么索引? – Asaph 2010-01-26 18:49:01