我有一个这样的表
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}