【问题标题】:MySQL: Use index in background queryMySQL:在后台查询中使用索引
【发布时间】: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


【解决方案1】:

好吧,也许这不是我想我会找到的答案,但它非常有效。

我已将audit_insert 字段拆分为另一个日期类型的audit_insert_datetype。该字段也有一个新索引。

我已将查询更改为使用此字段执行,并且我已尝试强制 @... 变量为日期类型(带有 current_date 和 date)。

结果:使用了新索引,执行时间大大减少。 也许这是一种糟糕的风格,但它可以满足我的需要。

【讨论】:

    【解决方案2】:

    所有日期算术都可以在 SQL 中完成。如果你这样做,它将使用索引。

    “常量”表达式(例如CURDATE() + INTERVAL 4 MONTH)在开始查询之前被评估为DATETIMETIMESTAMP 数据类型。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 2013-07-10
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2014-11-04
      • 1970-01-01
      相关资源
      最近更新 更多