首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >运行慢查询的简单MySQL表

运行慢查询的简单MySQL表
EN

Stack Overflow用户
提问于 2009-05-29 13:40:00
回答 3查看 1.1K关注 0票数 3

我有一个非常简单的表,有两列,但是有4.5M行。

代码语言:javascript
运行
复制
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;

当我运行如下所示的简单查询时:

代码语言:javascript
运行
复制
SELECT
    *   
FROM
    content_link
WHERE
    category_id = '11';

mysql会占用CPU资源,需要2-5秒才能返回大约10行数据。数据非常均匀地分布在表中,并且我正在访问索引字段(我还对表进行了分析/优化,并且从未更改过表的内容),那么查询花费这么长时间的原因是什么呢?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-29 13:45:07

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

重新创建您的二级密钥,如下所示:

代码语言:javascript
运行
复制
UNIQUE KEY `ix_category_id` (`category_id`, `content_id`)

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

票数 8
EN

Stack Overflow用户

发布于 2009-06-10 22:39:18

唯一键排序是一个很好的解决方案,您还应该向表中添加分区策略。

通过将表划分为片段,MySQL将使用正确的数据集查询特定的分区。我已经申请了,而且我的成绩很好。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2009-05-29 13:50:18

您没有使用索引。当您有一个像(content_id, category_id)这样的复合索引时,可以通过使用content_idcontent_idcategory_id来使用索引。您不能在使用category_id的同时利用索引。

尝试更改:

代码语言:javascript
运行
复制
KEY `content_id` (`content_id`, `category_id`)

代码语言:javascript
运行
复制
KEY `category_id` (`category_id`, `content_id`)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/926015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档