1

我有一个关于 MySQL 性能的问题。这些是我的表:

(大约 140.000 条记录)

CREATE TABLE IF NOT EXISTS `article` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `label` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `title` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `intro` text COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL,
  `date` int(11) NOT NULL,
  `active` int(1) NOT NULL,
  `language_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL,
  `indexed` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=132911 ;

(大约 400.000 条记录)

CREATE TABLE IF NOT EXISTS `article_category` (
  `article_id` int(11) NOT NULL,
  `category_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

运行此计数查询:

SELECT SQL_NO_CACHE COUNT(id) as total 
FROM (`article`) 
LEFT JOIN `article_category` ON `article_category`.`article_id` = `article`.`id` 
WHERE `article`.`language_id` = 1 
AND `article_category`.`category_id` = '<catid>'

这个查询需要很多资源,所以我想知道如何优化这个查询。执行后它被缓存了,所以在第一次运行后我很好。

运行解释函数:

在此处输入图像描述

创建索引后:

ALTER TABLE `article_category` ADD INDEX ( `article_id` , `category_id` ) ;

在此处输入图像描述

添加索引并将 LEFT JOIN 更改为 JOIN 后,查询运行得更快!感谢这些快速回复:)

我现在使用的查询(我删除了 language_id,因为它不是必需的):

SELECT COUNT(id) as total 
FROM (`article`) 
JOIN `article_category` ON `article_category`.`article_id` = `article`.`id` 
AND `article_category`.`category_id` = '<catid>'

我读过一些关于强制索引的内容,但我认为这不再是必要的了,因为这些表已经被索引了,对吧?

非常感谢!

马汀

4

2 回答 2

2

您尚未在表上创建必要的索引

article_category- 创建一个复合索引(article_id, category_id)

article- 创建一个复合索引(id, language_id)

如果这无助于发布解释声明。

于 2013-04-23T11:56:07.727 回答
1

JOIN 条件中使用的列应该有一个索引,所以你需要索引article_id

于 2013-04-23T11:55:01.927 回答