查询是否存在性能问题



我有一个这样的表

CREATE TABLE IF NOT EXISTS `test`.`job` (
`id` BIGINT(20) NOT NULL,
...
`creation_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_by` BIGINT(20) NOT NULL,
`last_modified_date` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`last_modified_by` BIGINT(20) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `test_date_idx` (`last_modified_date` DESC))
ENGINE = InnoDB;

,我想用SQL

查找开始日期和结束日期之间的数据
SELECT * FROM "test"
WHERE creation_date >= "{startingTime}"
AND creation_date <= "{endingTime}"

我的老板说可能有一个性能问题,如果我使用这个SQL查询,我想知道是什么问题的查询?

以下几点:

  • 要有效地满足您的查询,您需要此索引。

    ALTER TABLE job ADD INDEX creation (creation_date);
    

    MySQL可以随机访问到第一个符合条件的行,然后依次扫描。如果没有它,MySQL必须检查表中的每一行以找到符合条件的。

    MySQL处理像你这样的查询和使用BETWEEN的查询的方式相同。

  • 使用SELECT *通常比命名您需要的列效率低。这是因为您的应用程序通常不需要所有列。检索和发送不需要的列有点浪费。

让我们看看查询的其余部分。如果它更像

WHERE foo_id = 123
AND creation_date >= "{startingTime}"
AND creation_date <= "{endingTime}"

那么这将是最优的:

INDEX(foo_id, creation_date)

{endingTime}不是笨拙就是有bug。
笨笨的:这是没有乐趣键入2020/02/29 23:59:59
笨笨和Buggy:2020/03/01 00:00:00

"buggy"因为有一个额外的午夜。

如果范围只是天数,考虑:

AND creation_date >= "{startindDate}"
AND creation_date  < "{startindDate}" + INTERVAL {numDays}

相关内容

  • 没有找到相关文章

最新更新