2014-01-18 104 views
3

返回地面:我有800萬條記錄,我想加快查詢的時間,這是我的表MYSQL分區避免全掃描表

CREATE TABLE vehiclelog3 (
    ID INT(100) NOT NULL AUTO_INCREMENT, 

`PNumber` VARCHAR(30) DEFAULT NULL, 

    `Date` DATE DEFAULT NULL, 

    `Time` TIME DEFAULT NULL, 

    `Offset` VARCHAR(45) DEFAULT NULL, 

    `Street1` VARCHAR(60) DEFAULT NULL, 

    `Street2` VARCHAR(60) DEFAULT NULL, 

`City` VARCHAR(60) DEFAULT NULL, 

    `Region` VARCHAR(60) DEFAULT NULL, 
ect... 

    PRIMARY KEY (`ID`,`Date`), 
    UNIQUE KEY ID (`ID`,`Date`), 
    KEY date (`Date`), 
    KEY plate (`PNumber`) 
) ENGINE=INNODB 
PARTITION BY HASH(MONTH(`Date`)) 
    PARTITIONS 12; 

我的問題是我想避免全掃描表例如如果我的查詢是像

EXPLAIN PARTITIONS Select * from vehiclelog3 where PNumber = "bla" and Date = "2014-01-18" 

輸出:

1 SIMPLE  vehiclelog3 p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 index (NULL)   PRIMARY 7  (NULL) 3346217 Using where 

我只是想只掃描具有該DAT分區一個。可能嗎?

+0

我用你的'create'和'select',查詢只觸及一個分區,就像它應該的那樣。你可以發佈一個非截斷版本的創建查詢和一個真正的選擇查詢(你的選擇有'板塊列這是一個關鍵,而不是創建列)? –

+0

哦!對不起,我編輯板選擇查詢中的PNumber。 – zero

回答

1

SELECT * FROM tableNmae PARTITION(partitionName); 取自http://dev.mysql.com/doc/refman/5.6/en/partitioning-selection.html 可用於將SELECT限制爲只有一個分區。 因此,因爲您知道分區和您使用的日期之間的關係,所以這很簡單。

+0

我試試這個'SELECT * FROM vehiclelog3 PARTITION(p1);但我得到了這個錯誤'你的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在第11行'(p1)限制0,1000'附近使用正確的語法。 – zero

+0

是的,對不起。這是MySQL 5.6中引入的一項功能,如果您使用的是舊版本,則此查詢將失敗。所以這導致了一個問題:你能更新你的MySQL版本嗎? – Peter

+0

awts ok如果可以更新那裏的mysql,請嘗試聯繫我們的數據庫web服務器管理員。謝謝彼得 – zero