简单的MySQL表运行缓慢查询

简单的MySQL表运行缓慢查询

问题描述:

我有一个非常简单的表,有两列,但有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

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

重新创建您的辅助键如下:

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

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

+0

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

您未使用索引。如果您有像(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`) 

唯一键排序是一个很好的解决方案,你应该增加一个分区策略,以你的餐桌了。

通过对表中的分段进行分区,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