繁体   English   中英

这三个表中最优化的MySQL查询是什么?

[英]What's the most optimised MySQL query for these three tables?

我有四个表(但我只查询其中三个表):

文章 (文章是“项目”,类型6):* a_id,a_title,a_text *

关键字 (如果关键字是用于文章的关键字,则其类型为6):* kw_id,kw_type *

关键字翻译 * kw_id,language_id,kw_name *

Conn_Item_Keyword (项目与关键字之间的多对多连接表):* kw_id,kw_type,item_id *

假设我要查询ID为15且为英文(language_id = 1)的文章的所有关键字。

我可以这样写:

SELECT * FROM Conn_Item_Keyword c
LEFT JOIN Keywords k ON (c.kw_id = k.kw_id)
LEFT JOIN Keywords_Translation tr ON (c.kw_id = tr.kw_id)
WHERE c.kw_type = 6 AND c.item_id = 15 AND tr.language_id = 1

但是在我看来,这很慢,因为它将关键字连接到Conn_Item_Keyword的所有行。 我在联接中尝试了多个条件(c.kw_id = k.kw_id AND c.kw_type = 6 AND c.item_id = 15),但我无法正确找出。

编写此查询的最佳方法是什么?

1)将“ SELECT * ”替换为“ SELECT * SELECT col1, col2, expr3, ... ”,以便查询仅返回所需的表达式,并且仅引用SELECT列表中所需的列

2)从EXPLAIN获取输出

3)确保您拥有可以使用的合适索引,并且正在使用它们(在适当的地方覆盖索引)

在您的陈述中,我确实没有看到任何可怕的错误,但是我确实注意到,由于WHERE子句中的tr.language_id = 1谓词,因此对trtr.language_id = 1并不是真正的OUTER tr.language_id = 1 您可能不需要将与k连接成为外部连接,或者根本不需要与k的连接。 (但是我不清楚您要返回什么结果集。)

此查询返回的结果集有什么“错误”(太多行?缺少某些行?需要其他列?

SELECT c.kw_id
     , tr.kw_name
  FROM Conn_Item_Keyword c
  JOIN Keywords_Translation tr ON tr.kw_id = c.kw_id AND tr.language_id = 1
 WHERE c.kw_type = 6
   AND c.item_id = 15

如果您需要连接到关键字表,则

SELECT c.kw_id
     , tr.kw_name
  FROM Conn_Item_Keyword c
  JOIN Keywords_Translation tr ON tr.kw_id = c.kw_id AND tr.language_id = 1
  JOIN Keywords k ON k.kw_id = c.kw_id
 WHERE c.kw_type = 6
   AND c.item_id = 15

为了提高性能,请确认您具有诸如以下的索引:

Conn_Item_Keyword (item_id,kw_type,kw_id)
Keywords_Translation (kw_id,language_id)
Keywords(kw_id,kw_name)

查看EXPLAIN的输出以查看是否正在使用索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM