Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql连接顺序极大地改变了性能_Mysql_Performance_Join_Database Performance - Fatal编程技术网

Mysql sql连接顺序极大地改变了性能

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

所以我在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 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;