2013-04-09 85 views
1

我有一個MySQL的InnoDB表 -性能主鍵

create table data (
    `sha256` CHAR(64) NOT NULL, 
    'created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    <some other fields> 
    PRIMARY KEY (`sha256`), 
) 

一個在mysqld_slow_query最慢的查詢是

select * from data where created between "2013-02-01" and "2013-03-01"; 

爲了提高執行力這個查詢的,我有兩個選項:

選項1:添加一個索引創建

選項2:創建('創建','sha256')主鍵,並在sha256上添加索引。

思維這裏要說的是,當我們選擇了大量的行,如在一個月內收集到的數據,我想,以減少被訪問的B樹塊的數量。如果我們通過索引訪問這些記錄(選項1),我們仍然最終可能會爲每條記錄訪問不同的塊。相反,如果我們將按時間戳排序的記錄存儲爲主鍵/聚簇鍵(選項2),我們將在同一個B樹塊中找到大量記錄,這會減少磁盤讀取。

但由於某些原因,而選擇1提高了性能,選擇2並不能改善它一樣多。 任何想法爲什麼?還有其他建議嗎?提前致謝。因爲它使用集羣主索引和一個CHAR(64)使一個非常大的主鍵

+0

這是一個MyISAM或InnoDB表? – 2013-04-09 21:17:07

+0

從什麼時候mysql允許你在'CREATE TABLE'命令中使用''''? – Barmar 2013-04-09 21:17:51

+0

@G_Nugget InnoDB。 Barmar固定括號 – 2013-04-09 21:25:42

回答

1

InnoDB的是大主鍵特別敏感。我建議你添加一個AUTOINCREMENT id列作爲主鍵並給sha256一個唯一索引。那些與created索引一起應該有助於全方位的表現。在sha256上的查找會稍微慢一點,但其他一切都會更快。插入也將更快,因爲數據將永遠不需要被隨機值sha256左右移動。

我不完全知道爲什麼單項指標本來要快得多,但它可能與該指數是如此之大,即使它是一個聚集索引的事情。

+0

是的,我知道主鍵CHAR(64)是一個糟糕的主意,對於臨時性,我會使用HEX或char的子集(64) 。但這是一個單獨的問題。問題是 - 爲什麼索引('created')比主鍵('created')更好,這個特定的查詢會返回大量的行。 – 2013-04-09 23:18:07