简单的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对我说谎,我的主键实际上没有以正确的顺序键入,因为它正在向我显示表。
答
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_id
和category_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。
你是什么意思通过均匀分布?结果是否正确?你分析了I/O吗?有硬件延迟吗? – Richard 2009-05-29 13:45:39
通过均匀分布我的意思是我没有将ID集合在一起,所以mysql BTREE索引应该没有任何问题。 – Ian 2009-05-29 13:54:34