3

我有一个非常简单的表,有两列,但有 450 万行。

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 在返回大约 10 行之前会占用 CPU 并需要 2-5 秒。数据非常均匀地分布在整个表中,并且我正在访问索引字段(我还分析/优化了表并且我从未更改表的内容),那么查询需要这么长时间的原因是什么?

编辑: 似乎navicat 在对我撒谎,而我的主键实际上并没有按正确的顺序键入,因为它正在向我显示表格。

4

3 回答 3

8

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

重新创建您的辅助密钥,如下所示:

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

请注意列顺序,这很重要。

于 2009-05-29T13:45:07.487 回答
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。

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

于 2009-06-10T22:39:18.453 回答
1

您没有使用索引。当您有一个复合索引时,(content_id, category_id) 您可以通过 using 使用索引,content_id也可以使用content_idand category_id。您不能使用category_id和利用索引。

尝试改变:

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

KEY `category_id` (`category_id`, `content_id`)
于 2009-05-29T13:50:17.993 回答