如何计算查询时间来决定哪个更快或更有效?
How to calculate query time to decide which one is faster or more efficient?
我想比较我的算法,这里是我的案例的一些简化,
假设 table 使用 log_timestamp 列进行索引。
第一次查询:
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
第二次查询:
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
以上两个查询哪个更快,为什么?
你问的问题应该是两个不同的问题。首先,按照您上面提出的问题,这两个查询中哪个现在更快。第二个问题,也是真正需要考虑的问题,是如何调整两个查询以使其更快,以及哪个查询最快。
事实证明,只有第二个查询可以使用索引:
SELECT name
FROM user_table
WHERE log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR) AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
此查询应受益于 (log_timestamp, name)
上的索引。请注意,您的第一个查询不能真正受益于任何索引,因此我希望您的第二个查询在创建正确的索引后更快。
要了解查询的运行速度快慢,我们必须知道 table 中有多少条记录。
如果记录数还在100 - 1000之间(取决于table中的字段数),当两个查询都执行时,都会几乎同时显示结果。
如果记录数超过100,000条,显示结果会开始看时间差
记住,不要忘记使用 EXPLAIN 函数来查看查询的结果。
我们来分析一下这两个查询
第一次查询
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
MySQL 将:
- 在 DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) 遍历 table 中的所有记录而不使用索引,
- 之后 MySQL 将与 >= DATE('2018-01-01')
进行比较
- 在 DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) 遍历 table 中的所有记录而不使用索引,
- 之后 MySQL 将与 < DATE('2019-01-01');
进行比较
- 并显示结果
备注:
假设你在 table 中有 100,000 条记录,显示结果需要时间
第二次查询
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
MySQL 将:
- 比较log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR) 通过索引,不是全扫描table
- 并通过索引比较log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);,不是全扫描table
- 并显示结果
备注:
- 记住!!!... table中的索引,就像书中的索引一样。当您想阅读一本超过 1000 页的书时,您将首先看到索引以找到您要查找的页面。您不会阅读所有页面,找到您想要阅读的主题。
我想比较我的算法,这里是我的案例的一些简化, 假设 table 使用 log_timestamp 列进行索引。
第一次查询:
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
第二次查询:
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
以上两个查询哪个更快,为什么?
你问的问题应该是两个不同的问题。首先,按照您上面提出的问题,这两个查询中哪个现在更快。第二个问题,也是真正需要考虑的问题,是如何调整两个查询以使其更快,以及哪个查询最快。
事实证明,只有第二个查询可以使用索引:
SELECT name
FROM user_table
WHERE log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR) AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
此查询应受益于 (log_timestamp, name)
上的索引。请注意,您的第一个查询不能真正受益于任何索引,因此我希望您的第二个查询在创建正确的索引后更快。
要了解查询的运行速度快慢,我们必须知道 table 中有多少条记录。
如果记录数还在100 - 1000之间(取决于table中的字段数),当两个查询都执行时,都会几乎同时显示结果。
如果记录数超过100,000条,显示结果会开始看时间差
记住,不要忘记使用 EXPLAIN 函数来查看查询的结果。
我们来分析一下这两个查询
第一次查询
SELECT
name
FROM
user_table
WHERE
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) >= DATE('2018-01-01')
AND
DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) < DATE('2019-01-01');
MySQL 将:
- 在 DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) 遍历 table 中的所有记录而不使用索引,
- 之后 MySQL 将与 >= DATE('2018-01-01') 进行比较
- 在 DATE(DATETIME_ADD(log_timestamp , INTERVAL 7 HOUR)) 遍历 table 中的所有记录而不使用索引,
- 之后 MySQL 将与 < DATE('2019-01-01'); 进行比较
- 并显示结果 备注: 假设你在 table 中有 100,000 条记录,显示结果需要时间
第二次查询
SELECT
name
FROM
user_table
WHERE
log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR)
AND
log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);
MySQL 将:
- 比较log_timestamp >= DATETIME_SUB('2018-01-01', INTERVAL 7 HOUR) 通过索引,不是全扫描table
- 并通过索引比较log_timestamp < DATETIME_SUB('2019-01-01', INTERVAL 7 HOUR);,不是全扫描table
- 并显示结果
备注:
- 记住!!!... table中的索引,就像书中的索引一样。当您想阅读一本超过 1000 页的书时,您将首先看到索引以找到您要查找的页面。您不会阅读所有页面,找到您想要阅读的主题。