2011-05-11 25 views
0

可以優化以下查詢嗎?可以創建哪些索引?帶OR優化的mysql查詢

SELECT column_a 
    FROM Table_b 
    JOIN Table_a 
WHERE Table_B.ID_b = Table_A.ID_a 
    OR Table_B.ID_b = Table_A.ID_b; 

回答

0

如果ID_x字段鍵(主要或唯一的),這應該已經是相當不錯的。 (即,如果他們沒有,你應該確保受WHERE部分的所有字段建立索引。)

考慮發佈查詢的EXPLAIN

EXPLAIN SELECT column_a FROM Table_b JOIN Table_a 
WHERE Table_B.ID_b = Table_A.ID_a OR Table_B.ID_b = Table_A.ID_b; 

從評論:

| id | select_type | table | type | possible_keys        | key   | key_len | ref | rows  | Extra           | 
| 1 | SIMPLE  | Table_b | index | INDEX_ON_ID_b        | INDEX_ON_ID_b | 3  | NULL | 1507  | Using index; Using temporary      | 
| 1 | SIMPLE  | Table_a | ALL |ID_a,ID_b,ID_a_column_a, ID_b_column_a_index | NULL   | NULL | NULL | 29252089 | Range checked for each record (index map: 0x306) | 
+0

說明輸出 - | id | select_type |表| |鍵入| possible_keys |關鍵| key_len | ref |行|額外| ---------- + | 1 | SIMPLE |表_ | index | INDEX_ON_ID_b | INDEX_ON_ID_b | 3 | NULL | 1507 |使用索引;使用臨時| | 1 | SIMPLE | Table_a | ALL | ID_a,ID_b,ID_a_column_a,ID_b_column_a_index | NULL | NULL | NULL | 29252089 |每個記錄檢查範圍(索引映射:0x306)| – 2011-05-11 06:58:56

+0

@jensgram - 說明輸出 - | id | select_type |表| |鍵入| possible_keys |關鍵| key_len | ref |行|額外| ---------- + | 1 | SIMPLE |表_ | index | INDEX_ON_ID_b | INDEX_ON_ID_b | 3 | NULL | 1507 |使用索引;使用臨時| | 1 | SIMPLE | Table_a | ALL | ID_a,ID_b,ID_a_column_a,ID_b_column_a_index | NULL | NULL | NULL | 29252089 |範圍檢查每個記錄(索引映射:0x306 – 2011-05-11 08:00:37

+0

@jensgram - 更多建議? – 2011-05-11 08:17:45

2

您的查詢實際上應該是:

SELECT column_a 
    FROM Table_b 
    JOIN Table_a ON Table_B.ID_b IN (Table_A.ID_a, Table_A.ID_b) 

如果你沒有提供JOIN的ON標準,MySQL接受這是一個CROSS JOIN--結果是一個笛卡爾積(這很糟糕,除非這真的是你想要的)。如果我知道這表column_a是從哪裏來的,我可能會建議不同的方法來查詢...

指數如下:

  • Table_B.ID_b
  • Table_A.ID_a
  • 表-A。 ID_b

TABLE_A中的兩列可以是覆蓋索引而不是單獨的索引。

+0

嘗試了上述但解釋沒有改變 – 2011-05-11 07:10:45

+0

column_A來自Table_A。 – 2011-05-11 07:59:25

+0

還有更多建議嗎? – 2011-05-11 08:18:05