簡體   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