我对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>'
我已经阅读了一些关于强制索引的内容,但我认为这不再是必要的,因为这些表已经被索引了,对吧?
非常感谢!
马亭
答案 0 :(得分:2)
您尚未在表格上创建必要的索引
表格article_category
- 在(article_id, category_id)
表article
- 在(id, language_id)
如果这无助于发布解释声明。
答案 1 :(得分:1)
JOIN条件中使用的列应该有索引,因此您需要索引article_id
。