Mysql
創建空表後性能更差
我正在使用 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
筆記:
- 為什麼有兩個唯一索引?你不能只住一個嗎?(不知道“發票”中的“請求”,我無法提供進一步的建議。)
- 不要費心添加以 PK 的列開頭的索引
UNIQUE
索引是索引加上唯一性約束。因此,不要費心添加具有相同列的另一個索引。從長遠來看,擁有一堆類似的表格
201805_invoice_requests
將是一個問題。(有很多執行緒討論擁有多個相同的表。)