2017-05-02 73 views
0

我在AWS中有一個生產數據庫,但localhost中的相同數據庫要快得多(25s VS 7s),做了一些研究,我發現在同一個SQL中有一個差異:不同的key_len結果在相同的數據庫中(不同的環境)

EXPLAIN extended 
SELECT * 
FROM pipeline p 
JOIN invoice i ON p.invoice_id = i.id 
WHERE i.whenCreated BETWEEN "2017-01-01 00:00:00" AND "2017-01-31 00:00:00" 

在AWS =====> key_len = 8和額外=使用其中。
在localhost ==> key_len = 5和Extra =使用索引條件。

我在這兩個網站之前跑:

OPTIMIZE TABLE invoice; 

也許這是一個配置問題,但我迷路了。


更多信息:
MySQL版本在AWS:46年5月5日
MySQL版本在本地主機:5.6.24

在AWS解釋:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: i 
     type: range 
possible_keys: PRIMARY,IDX_5FD82ED84DD79520 
      key: IDX_5FD82ED84DD79520 
     key_len: 8 
      ref: NULL 
     rows: 847 
    filtered: 100.00 
     Extra: Using where 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: p 
     type: ref 
possible_keys: UNIQ_848ABB8F2989F1FD 
      key: UNIQ_848ABB8F2989F1FD 
     key_len: 5 
      ref: ontrocrm.i.id 
     rows: 1 
    filtered: 100.00 
     Extra: Using where 

解釋在本地主機:

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: i 
     type: range 
possible_keys: PRIMARY,IDX_5FD82ED84DD79520 
      key: IDX_5FD82ED84DD79520 
     key_len: 5 
      ref: NULL 
     rows: 847 
    filtered: 100.00 
     Extra: Using index condition 
*************************** 2. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: p 
     type: ref 
possible_keys: UNIQ_848ABB8F2989F1FD 
      key: UNIQ_848ABB8F2989F1FD 
     key_len: 5 
      ref: ontrocrm.i.id 
     rows: 1 
    filtered: 100.00 
     Extra: NULL 

創建表在兩個相同的,一個是從其他備份:

CREATE TABLE `invoice` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `number` int(11) NOT NULL, 
    `whenCreated` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `unique_number` (`number`), 
    KEY `IDX_5FD82ED84DD79520` (`whenCreated`) 
) 

回答

1

解釋key_len差異

你發現,在5.6.4與DATETIMETIMESTAMP發生變化。之前,它們分別是8個字節(壓縮十進制)和4個字節(只是一個INT)。之後,它們都是5個以上的字節,包括能夠包含多達6個小數位的微秒。

「使用,其中」並不意味着很多。 「使用索引條件」指的是「ICP」或「指標狀況下推」,這是通常加快不具備最佳的綜合指數查詢的優化。 [在這一點上,我需要看到SHOW CREATE TABLE;我會猜測而不是從引擎(InnoDB的)路過的每一行回「上升」的「處理」作進一步的分析你正使用InnoDB],在「條件」(WHERE ...)推「下」到引擎,它可以更快地處理。

情況下,你會得到3-4倍加速;不錯。 (我的經驗法則:2X)

其他

你真的做SELECT *?如果你不需要所有的列,應該拼出所需的列;您可能會錯過一些優化潛力。

UNIQ_848ABB8F2989F1FD 「獨特的」,或者是名不副實?

如果invoice.numberUNIQUE,爲什麼不使用它作爲PRIMARY KEY並完全擺脫id?這會加快一些操作(儘管 可能不是當前的SELECT)。

您可能注意到OPTIMIZE TABLE幾乎沒有影響?

相反的WHERE i.whenCreated BETWEEN "2017-01-01 00:00:00" AND "2017-01-31 00:00:00",這需要額外的第二,需要計算月結束,我想說:

WHERE i.whenCreated >= "2017-01-01" 
    AND i.whenCreated < "2017-01-01" + INTERVAL 1 MONTH 
+0

非常感謝,非常有用的答案。 – Cyrus

相關問題