正确做法是将查询条件转换为与索引列相同的数据类型,避免在索引列上使用函数,从而确保索引有效,提升查询性能。

MySQL中处理时间戳和日期格式的互转,核心在于使用
UNIX_TIMESTAMP()
FROM_UNIXTIME()
WHERE
在MySQL中,时间戳(通常是
INT
BIGINT
DATE
DATETIME
TIMESTAMP
日期/时间转时间戳: 使用
UNIX_TIMESTAMP(date_expression)
SELECT UNIX_TIMESTAMP('2023-10-26 10:30:00');1698306600
DATETIME
SELECT UNIX_TIMESTAMP(create_time) FROM your_table;
时间戳转日期/时间: 使用
FROM_UNIXTIME(unix_timestamp [, format])
SELECT FROM_UNIXTIME(1698306600);
2023-10-26 10:30:00
SELECT FROM_UNIXTIME(1698306600, '%Y-%m-%d %H:%i:%s');
实战中,我们经常会遇到这样的场景:数据库里有个字段
record_time
INT
错误且低效的做法:
SELECT * FROM your_table WHERE FROM_UNIXTIME(record_time, '%Y-%m-%d') = '2023-10-26';
或者更常见的范围查询:
SELECT * FROM your_table WHERE FROM_UNIXTIME(record_time) BETWEEN '2023-10-26 00:00:00' AND '2023-10-26 23:59:59';
这样的查询,即使
record_time
FROM_UNIXTIME()
正确且高效的做法:
将查询条件(日期字符串)转换为时间戳,然后用时间戳进行比较。
SELECT *
FROM your_table
WHERE record_time >= UNIX_TIMESTAMP('2023-10-26 00:00:00')
AND record_time <= UNIX_TIMESTAMP('2023-10-26 23:59:59');这样,
record_time
WHERE
这事儿吧,说起来简单,做起来就容易踩坑。我们都知道,给数据库表加索引是为了加快查询速度,特别是针对
WHERE
但当你像这样写SQL的时候:
WHERE FROM_UNIXTIME(indexed_column) = 'some_date'
原因很简单:数据库的索引是建立在原始列值上的。当你对列值应用了一个函数,比如
FROM_UNIXTIME()
FROM_UNIXTIME(indexed_column)
这个技巧说白了,就是“以其人之道还治其人之身”,但不是对着索引列下手。我们要做的是,确保
WHERE
来看几个具体的例子,假设我们有一个
orders
created_at
场景一:created_at
INT
低效写法(避免):
-- 这样写,created_at上的索引就废了 SELECT order_id, created_at FROM orders WHERE FROM_UNIXTIME(created_at, '%Y-%m-%d') = '2023-10-26';
高效写法(推荐):
-- 将日期字符串转换为时间戳范围
SELECT order_id, created_at
FROM orders
WHERE created_at >= UNIX_TIMESTAMP('2023-10-26 00:00:00')
AND created_at < UNIX_TIMESTAMP('2023-10-27 00:00:00'); -- 注意这里用 < 下一天的0点,更精确或者如果你只关心某个精确的时间点:
SELECT order_id, created_at
FROM orders
WHERE created_at = UNIX_TIMESTAMP('2023-10-26 10:30:00');场景二:created_at
DATETIME
低效写法(避免):
-- 这样写,created_at上的索引也废了 SELECT order_id, created_at FROM orders WHERE UNIX_TIMESTAMP(created_at) = 1698306600;
高效写法(推荐):
-- 将时间戳转换为DATETIME类型进行比较 SELECT order_id, created_at FROM orders WHERE created_at = FROM_UNIXTIME(1698306600);
对于范围查询:
SELECT order_id, created_at FROM orders WHERE created_at >= FROM_UNIXTIME(1698306600) -- 2023-10-26 10:30:00 AND created_at < FROM_UNIXTIME(1698307200); -- 2023-10-26 10:40:00
通过这些例子可以看出,核心思路就是:让数据库列保持原样,让外部的查询条件去适应列的类型。 这样,数据库的优化器就能愉快地使用你为该列创建的索引了。
说实话,时间戳与日期互转只是冰山一角,提升
WHERE
1. 合理使用索引: 这几乎是老生常谈,但却是最重要的。
WHERE
WHERE
WHERE status = 'active' AND user_id = 123
INDEX (status, user_id)
SELECT user_id, status FROM users WHERE status = 'active'
INDEX (status, user_id)
2. 选择正确的数据类型: 数据类型对查询效率和存储空间都有影响。
INT UNSIGNED
VARCHAR
DATETIME
TIMESTAMP
VARCHAR
3. 避免全表扫描的操作: 除了前面提到的在索引列上使用函数,还有一些操作也容易导致全表扫描:
LIKE '%keyword'
LIKE
LIKE 'keyword%'
OR
OR
UNION ALL
OR
NOT IN
!=
IN
BETWEEN
4. 优化子查询和连接:
EXISTS
IN
EXISTS
IN
STRAIGHT_JOIN
ON
5. 了解查询执行计划(EXPLAIN
EXPLAIN
EXPLAIN
总的来说,提升
WHERE
以上就是MySQL时间戳与日期互转实战 where条件查询效率提升方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号