如何计算查询时间来决定哪个更快或更有效?

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 页的书时,您将首先看到索引以找到您要查找的页面。您不会阅读所有页面,找到您想要阅读的主题。