我正在使用 MySQL 5.7.10,但遇到了这个问题。
我有这张表来跟踪请求:
CREATE TABLE `invoice_requests` (
`REQUEST_ID` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8_spanish_ci',
`INVOICE_ID` VARCHAR(50) NULL DEFAULT NULL COLLATE 'utf8_spanish_ci',
`STARTTIME` DATETIME NULL DEFAULT NULL,
`ENDTIME` DATETIME NULL DEFAULT NULL,
`STATUS` VARCHAR(10) NOT NULL DEFAULT 'WORKING',
PRIMARY KEY (`REQUEST_ID`),
UNIQUE INDEX `UNQ_INVOICE_ID` (`INVOICE_ID`),
INDEX `IDX_REQ_CODE_END_TIME` (`REQUEST_ID`, `ENDTIME`),
INDEX `IDX_INV_NUMBER` (`INVOICE_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
该表有 350MB 和去年的数据。所以我做了以下步骤:
- 将表 invoice_requests 重命名为 201805_invoice_requests;
- 运行上面的“创建表”。
第一次执行这个新的空表会使某些查询的性能变差(从 1 秒到 15 秒)。
使用 MySQL EXPLAIN,我们已经检查过在与其他表的 INNER JOIN 中没有使用索引,但是查询是相同的,并且 JOIN 是使用索引字段 INVOICE_ID 进行的。
出于测试目的,我们退出了查询中的 invoice_requests JOIN,请求的数据再次快速返回。
在这种情况下,我的问题是:
- 这些是备份表(及其索引)的正确步骤吗?
- 我需要新的空表中的“旧”索引数据吗?据推测,没有。但我不明白这种行为。
任何帮助将不胜感激。
这将有助于查看慢速查询及其
EXPLAIN
.同时,尝试
空表上没有有用的“统计信息”。InnoDB应该在你遇到这个问题之前重新计算统计数据,但我们可能会遗漏一些东西。
索引一团糟:
笔记:
为什么有两个唯一索引?你不能只和一个一起生活吗?(不知道来自“发票”的“请求”,我无法提供进一步建议。)
不要费心添加以 PK 的列开头的索引
UNIQUE
索引是索引加上唯一性约束。因此,不要费心添加具有相同列的另一个索引。从长远来看,拥有一堆这样的表
201805_invoice_requests
将是一个问题。(有很多线程讨论有多个相同的表。)在昨天的帖子中,invoice_requests 表有 68k 行,性能非常低。
现在,又来了一些新的请求,只多了59行。
我正在重复查询以捕获结果和 EXPLAIN 数据,出乎意料的是,查询不到一秒钟。
我无法给出任何解释,昨天的帖子没有任何变化。也许这不是一条信息丰富的消息,但我尽量不留下已打开的帖子。也许我应该等待更多时间来发布我的问题,但昨天该查询在不同时刻花费了 13-15 秒数十次。
所以,非常感谢。