运行慢查询的简单MySQL表

时间:2009-05-29 13:40:00

标签: sql mysql performance myisam

我有一个非常简单的表,有两列,但有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对我撒谎,我的主键实际上没有按照正确的顺序键入,因为它正在向我显示表格。

3 个答案:

答案 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。

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

答案 2 :(得分: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`)