对于这三个表,最优化的MySQL查询是什么?

时间:2012-08-30 16:03:53

标签: mysql join query-optimization multi-table

我有四张桌子(但我只会查询其中三张):

文章(文章是'item',类型6): * a_id,a_title,a_text *

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

Keywords_Translation * 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 个答案:

答案 0 :(得分:0)

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

2)从EXPLAIN

获取输出

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

我的声明中没有看到任何可怕的错误,但我注意到tr的加入并不是真正的OUTER加入,因为{{1}中的tr.language_id = 1谓词子句。您可能不需要将WHERE加入为OUTER加入,或者您可能根本不需要加入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

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