MySQL优化计数查询

MySQL优化计数查询,mysql,optimization,join,count,Mysql,Optimization,Join,Count,我有一个关于MySQL性能的问题。 这些是我的桌子: (约140000条记录) (约40万条记录) 运行此计数查询: 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_cat

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

(约140000条记录)

(约40万条记录)

运行此计数查询:

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>'

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

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

选择计数(id)作为总数
FROM(`article`)
加入'article'u category'上的'article'u category'。'article'u id`='article`.'id`
和'article\u category'。'category\u id`='
我读过一些关于强制索引的内容,但我认为这不再必要了,因为表已经被索引了,对吗

非常感谢


Martijn

连接条件中使用的列应该有一个索引,因此您需要索引
文章id

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

article\u category
-在
(article\u id,category\u id)

文章
-在
(id,language\u id)


如果这对发布解释语句没有帮助。

显示解释结果,在
文章\u类别上添加索引。文章\u id
。要么你不应该做
左连接
,要么你需要在
on
子句中测试
类别\u id=
。否则,您将筛选出
文章\u类别中不匹配的文章。
。您是否尝试过创建我提到的其他索引。。。这有什么区别吗?试着在语言id上创建一个简单的索引
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` ) ;
SELECT COUNT(id) as total 
FROM (`article`) 
JOIN `article_category` ON `article_category`.`article_id` = `article`.`id` 
AND `article_category`.`category_id` = '<catid>'