【发布时间】:2020-06-22 08:06:08
【问题描述】:
我使用的是 MySQL 5.7.10。
我正在检查审计报告的新查询。
我将在一个简单的后台 Unix 进程中执行它,该进程从控制台调用 mysql。
为了检查查询,我使用 HeidiSQL 中的工作表。
表格是:
CREATE TABLE `services` (
`assigned_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`service_id` VARCHAR(10) NOT NULL,
`name` VARCHAR(50) NOT NULL,
...
`audit_insert` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
...
INDEX `idx_audit_insert` (`audit_insert`),
...
);
简单的工作表是:
SET @numberOfMonths:=6;
SET @today:=CURRENT_TIMESTAMP();
SET @todaySubstractnumberOfMonths=TIMESTAMP( date_sub(@today, interval @numberOfMonths MONTH) );
EXPLAIN SELECT service_id from services where audit_insert between @todaySubstractnumberOfMonths and @today;
该查询的解释输出是: id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,Extra 1,SIMPLE,services,[所有分区],ALL,idx_audit_insert,,,,47319735,21.05,使用where
因此,未使用索引“idx_audit_insert”。
如果我将查询更改为:
EXPLAIN SELECT service_id where audit_insert between '2020-01-01 00:00:00' and '2020-03-10 23:59:59';
输出是: id,select_type,table,partitions,type,possible_keys,key,key_len,ref,rows,filtered,Extra 1,SIMPLE,tdom_transitos,[所有分区],范围,idx_audit_insert,idx_audit_insert,4,,4257192,100.00,使用索引条件
现在,使用索引并且行值显着减少。
所以,我的问题是:
- 如何强制变量为时间戳?我的工作表有什么错误吗?
或许
- 如何使用索引(尽量避免使用 USE INDEX、FORCE INDEX...等提示)?
非常感谢。
(编辑:我在 dbastackexchange 中复制了同样的问题。也许更适合那个论坛)。
【问题讨论】:
-
如何强制变量为时间戳? 明确尝试
where audit_insert between CAST(@todaySubstractnumberOfMonths AS DATETIME) and CAST(@today AS DATETIME);如何使用索引 您必须至少有数据7-8 年(为期 1 个月)... -
@akina,感谢您对 CAST() 的建议,但它不起作用。
标签: mysql query-optimization database-indexes