我有一张表格,大约有150万行和三个列。列'timestamp'的类型为REAL并被索引。我通过PHP PDO访问SQLite数据库。
以下三个查询在不到1毫秒的时间内运行:
select timestamp from trades
select timestamp + 1 from trades
select max(timestamp) from trades
下面的选择器需要近半秒钟的时间:
select max(timestamp) + 1 from trades
为什么会这样呢?
编辑: Lasse要求一个“解释查询计划”,由于我目前没有SQLite3命令行工具直接访问,所以我在PHP PDO查询中运行了它。我猜这没关系,这是结果:
explain query plan select max(timestamp) + 1 from trades:
[selectid] => 0
[order] => 0
[from] => 0
[detail] => SCAN TABLE trades (~1000000 rows)
explain query plan select max(timestamp) from trades:
[selectid] => 0
[order] => 0
[from] => 0
[detail] => SEARCH TABLE trades USING COVERING INDEX tradesTimestampIdx (~1 rows)
explain query plan select max(timestamp)+1 from trades;
并告诉我们它的含义,然后对于explain query plan select max(timestamp) from trades;
做同样的事情。 - Lasse V. Karlsenexplain query plan
的结果。我猜Tim的答案是正确的?有没有在SQL中的变通方法?当然,在运行查询之后,我可以在PHP中添加一个变通方法,但是选择目前是一个子查询,我更喜欢保持这样。好的,我可能会用当前版本的SQLite测试这个。 - Toxiro