Mysql sql连接顺序极大地改变了性能
所以我在mysql中有两个表:articles和articles\u rubrics,都有大约20000行 项目有多个COL,但其项目id已编入索引 articles_rubrics只有两个col:article_id和rubrics_id,它们都是单独索引的,除此之外还有这两个的联合索引 我的问题是,当我使用join从这些表中选择数据时,顺序非常重要,这对我来说是一个问题,我不理解其原因:Mysql sql连接顺序极大地改变了性能,mysql,performance,join,database-performance,Mysql,Performance,Join,Database Performance,所以我在mysql中有两个表:articles和articles\u rubrics,都有大约20000行 项目有多个COL,但其项目id已编入索引 articles_rubrics只有两个col:article_id和rubrics_id,它们都是单独索引的,除此之外还有这两个的联合索引 我的问题是,当我使用join从这些表中选择数据时,顺序非常重要,这对我来说是一个问题,我不理解其原因: SELECT article_id,rubric_id FROM articles LEFT JOIN
SELECT article_id,rubric_id FROM articles
LEFT JOIN articles_rubrics USING(article_id)
WHERE rubric_id=1
ORDER BY article_id DESC
LIMIT 10;
并解释说(对于文章_rubrics):
但当我改变它的顺序时:
SELECT article_id,rubric_id FROM articles_rubrics
LEFT JOIN articles USING(article_id)
WHERE rubric_id=1
ORDER BY article_id DESC
LIMIT 10;
并解释说(对于文章_rubrics):
所以我有两个表,这使得它们的查询速度慢了300倍。这怎么可能呢
PS:在这个例子中,我已经大大简化了我的现实世界问题,但我偶然发现了这个问题,因为我的
SELECT * FROM articles [LEFT JOIN for 5 other tables]
需要1.5秒,当我向混合中添加其他连接时,执行时间更改为0.006秒
显示索引:
show index from articles;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
articles 0 PRIMARY 1 article_id A 20043 NULL NULL BTREE
articles 1 article_url_title 1 article_url_title A 10021 NULL NULL BTREE
articles 1 FULLTEXT 1 article_title NULL 1 NULL NULL FULLTEXT
articles 1 FULLTEXT 2 article_content NULL 1 NULL NULL FULLTEXT
show index from articles_rubrics;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type
articles_rubrics 0 PRIMARY 1 article_id A NULL NULL NULL BTREE
articles_rubrics 0 PRIMARY 2 rubric_id A 20814 NULL NULL BTREE
articles_rubrics 1 rubric_id 1 rubric_id A 17 NULL NULL BTREE
articles_rubrics 1 article_id 1 article_id A 20814 NULL NULL BTREE
您需要在每个引用中使用表或表别名。数据库上的联接操作是昂贵的过程。最好使用简单的选择嵌套。创建一个列表来存储数据,然后将列表中的项目用于下一个查询 你能提供两个表上的可用索引吗<代码>显示来自表\u name的索引请检查:这看起来确实是错误的<代码>从文章\u准则左侧使用(文章\u id)加入文章\u准则它正在加入自身。此外,请在所有对列的引用(包括where子句)中使用表名或别名。性能可能取决于您引用的表。谢谢!然而,由于where子句的原因,您不需要
左连接
。啊,我理解这一点,并将在我的代码中相应地修复它。我想我对左撇子太熟悉了。然而,EXPLAIN中索引表的极端性能命中率和~7000个结果仍然存在。EXPLAIN
应该有2行,而不是1行。从文章中选择a.article\u id,ar.rubric\u id,a.article\u id=ar.article\u id=1,按a.article\u id描述限制10代码>运行0,2秒,左连接运行0.25秒,但仍应运行0.001秒。该注释的目的是什么?
SELECT * FROM articles [LEFT JOIN for 5 other tables]
show index from articles;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
articles 0 PRIMARY 1 article_id A 20043 NULL NULL BTREE
articles 1 article_url_title 1 article_url_title A 10021 NULL NULL BTREE
articles 1 FULLTEXT 1 article_title NULL 1 NULL NULL FULLTEXT
articles 1 FULLTEXT 2 article_content NULL 1 NULL NULL FULLTEXT
show index from articles_rubrics;
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type
articles_rubrics 0 PRIMARY 1 article_id A NULL NULL NULL BTREE
articles_rubrics 0 PRIMARY 2 rubric_id A 20814 NULL NULL BTREE
articles_rubrics 1 rubric_id 1 rubric_id A 17 NULL NULL BTREE
articles_rubrics 1 article_id 1 article_id A 20814 NULL NULL BTREE
SELECT article_id,rubric_id
FROM articles
LEFT JOIN articles_rubrics USING(article_id)
WHERE rubric_id=1 <<<<<<<<<<<<<<<<<<<<<<<<<<< problem here
ORDER BY article_id DESC
LIMIT 10;
SELECT a.article_id, ar.rubric_id
FROM articles AS a
INNER JOIN articles_rubrics AS ar ON a.article_id = ar.article_id
WHERE ar.rubric_id = 1
ORDER BY a.article_id DESC
LIMIT 10;