gpt4 book ai didi

MySql转换问题: from UNIX_TIMESTAMP to INT(11)

转载 作者:行者123 更新时间:2023-11-29 02:37:56 26 4
gpt4 key购买 nike

在包含 1500000 行的 MySql 表上运行以下选择大约需要 5 分 30 秒。

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)

我们在这里不讨论索引——我不是数据库的所有者,但我会要求在该列上建立索引。

我想问你为什么两个查询之间的持续时间差异很大?

似乎 timestamp 列中的每个 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



更新 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 分钟!

最佳答案

我使用 MySQL 的 BENCHMARK() 运行了这两个查询功能:

mysql> SELECT BENCHMARK(15000000, 1208911022 BETWEEN 
UNIX_TIMESTAMP('2008-04-23 01:37:02') AND UNIX_TIMESTAMP('2008-04-23 01:37:03'));
1 row in set (33.28 sec)

mysql> SELECT BENCHMARK(15000000, 1208911022 BETWEEN 1208911022 AND 1208911023);
1 row in set (0.52 sec)

看来 MySQL 不够聪明,无法分解出 UNIX_TIMESTAMP() 表达式,即使它们应该是常量。 MySQL 在表达式的每次迭代期间计算函数。所以在这个测试中使用这个函数大约慢了 64 倍。

我在 Macbook 2.4GHz Intel Core 2 Duo 上运行 MySQL 5.1.41。

我建议您在准备查询之前将时间戳转换为整数值。

关于MySql转换问题: from UNIX_TIMESTAMP to INT(11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2136406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com