2009-05-29 45 views
3

我有一個非常簡單的表,有兩列,但有4.5M行。簡單的MySQL表運行緩慢查詢

CREATE TABLE `content_link` (
    `category_id` mediumint(8) unsigned NOT NULL, 
    `content_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`content_id`,`category_id`), 
    KEY `content_id` (`content_id`,`category_id`) 
) ENGINE=MyISAM; 

當我運行像一個簡單的查詢:

SELECT 
    * 
FROM 
    content_link 
WHERE 
    category_id = '11'; 

mysql的尖峯CPU和返回約10行之前,需要2-5秒。數據在表中非常均勻地分佈,並且我正在訪問索引字段(我也分析/優化了表,並且我從不更改表的內容),所以查詢需要這麼長時間的原因是什麼?

編輯:看起來navicat對我說謊,我的主鍵實際上沒有以正確的順序鍵入,因爲它正在向我顯示錶。

+0

你是什麼意思通過均勻分佈?結果是否正確?你分析了I/O嗎?有硬件延遲嗎? – Richard 2009-05-29 13:45:39

+0

通過均勻分佈我的意思是我沒有將ID集合在一起,所以mysql BTREE索引應該沒有任何問題。 – Ian 2009-05-29 13:54:34

回答

8

category_id不是任何索引中的第一列。

重新創建您的輔助鍵如下:

UNIQUE KEY `ix_category_id` (`category_id`, `content_id`) 

注意列的順序,它很重要。

+0

+1;接得好; QWERTYUIOPOIUYTREWQ – Richard 2009-05-29 13:47:20

1

您未使用索引。如果您有像(content_id, category_id)這樣的組合索引,則可以使用content_id的索引,或者可以使用content_idcategory_id。您不能使用category_id並使用索引。

嘗試改變:

KEY `content_id` (`content_id`, `category_id`) 

KEY `category_id` (`category_id`, `content_id`) 
2

唯一鍵排序是一個很好的解決方案,你應該增加一個分區策略,以你的餐桌了。

通過對錶中的分段進行分區,MySQL將使用正確的數據集查詢特定的分區。我申請了,而且我的成績很好。

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) 
ENGINE=INNODB 
PARTITION BY HASH(MONTH(tr_date)) 
PARTITIONS 6; 

您需要MySQL 5.1。

嘗試http://dev.mysql.com/doc/refman/5.1/en/partitioning.html