Mysql

創建空表後性能更差

  • June 5, 2018

我正在使用 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.

同時,試試

ANALYZE TABLE invoice_requests;

空表上沒有有用的“統計資訊”。在你遇到這個問題之前, InnoDB應該已經重新計算了統計數據,但我們可能會遺漏一些東西。

索引是一團糟:

PRIMARY KEY (`REQUEST_ID`),   -- notes 1,2
UNIQUE INDEX `UNQ_INVOICE_ID` (`INVOICE_ID`),  -- notes 1,3
INDEX `IDX_REQ_CODE_END_TIME` (`REQUEST_ID`, `ENDTIME`),  -- note 2
INDEX `IDX_INV_NUMBER` (`INVOICE_ID`)  -- note 3

筆記:

  1. 為什麼有兩個唯一索引?你不能只住一個嗎?(不知道“發票”中的“請求”,我無法提供進一步的建議。)
  2. 不要費心添加以 PK 的列開頭的索引
  3. UNIQUE索引是索引加上唯一性約束。因此,不要費心添加具有相同列的另一個索引。

從長遠來看,擁有一堆類似的表格201805_invoice_requests將是一個問題。(有很多執行緒討論擁有多個相同的表。)

引用自:https://dba.stackexchange.com/questions/208720