根据时间戳过滤大量行
Filtering large number of rows based on timestamp
我有一个 table,其中包含 800 万条记录,我需要根据名为 connect_timestamp
且类型为 TIMESTAMP 的字段执行删除和 SELECT 等操作. table 称为 data
。
但是做类似
的事情
SELECT count(*) FROM data
WHERE unix_timestamp(connect_timestamp
)
< 1483272827
耗时很长,导致NGINX等服务超时,对于这么大的数据量,有没有更好的办法用内置的MySQl函数来解决?
我认为这是由于 unix_timestamp() 函数,但是执行 DATE_SUB
也没有帮助
该列确实应用了索引。
提高性能的一种方法是避免在列上进行转换类型(这意味着查询优化器未优化使用索引和/或数据table 的recorse 进行过滤)。所以你应该使用 where没有转换的条件
SELECT count(*)
FROM data WHERE connect_timestamp < '2017-03-03 10:10:10'
在将时间戳放入查询之前尝试格式化时间戳,然后直接与 connect_timestamp
进行比较
SELECT count(*) FROM data WHERE connect_timestamp < '2017-01-01 12:13:00'
此外,这还会计算 1 月 1 日之前的所有数据,如果此处有大量数据,则无论如何都必须遍历所有这些行
试试这个:
SELECT count(*) FROM data WHERE connect_timestamp < FROM_UNIXTIME(1483272827)
我有一个 table,其中包含 800 万条记录,我需要根据名为 connect_timestamp
且类型为 TIMESTAMP 的字段执行删除和 SELECT 等操作. table 称为 data
。
但是做类似
的事情SELECT count(*) FROM
data
WHERE unix_timestamp(connect_timestamp
) < 1483272827
耗时很长,导致NGINX等服务超时,对于这么大的数据量,有没有更好的办法用内置的MySQl函数来解决?
我认为这是由于 unix_timestamp() 函数,但是执行 DATE_SUB 也没有帮助
该列确实应用了索引。
提高性能的一种方法是避免在列上进行转换类型(这意味着查询优化器未优化使用索引和/或数据table 的recorse 进行过滤)。所以你应该使用 where没有转换的条件
SELECT count(*)
FROM data WHERE connect_timestamp < '2017-03-03 10:10:10'
在将时间戳放入查询之前尝试格式化时间戳,然后直接与 connect_timestamp
进行比较SELECT count(*) FROM data WHERE connect_timestamp < '2017-01-01 12:13:00'
此外,这还会计算 1 月 1 日之前的所有数据,如果此处有大量数据,则无论如何都必须遍历所有这些行
试试这个:
SELECT count(*) FROM data WHERE connect_timestamp < FROM_UNIXTIME(1483272827)