我有一个非常简单的表,有两列,但有4.5M行。
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 :(得分:8)
category_id
不是任何索引中的第一列。
按如下方式重新创建辅助密钥:
UNIQUE KEY `ix_category_id` (`category_id`, `content_id`)
注意列顺序,这很重要。
答案 1 :(得分:2)
UNIQUE KEY排序是一个很好的解决方案,您也应该在表中添加分区策略。
通过将表分割成片段,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。
答案 2 :(得分:1)
您没有使用索引。如果您拥有(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`)