可以優化以下查詢嗎?可以創建哪些索引?帶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;
可以優化以下查詢嗎?可以創建哪些索引?帶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;
如果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) |
您的查詢實際上應該是:
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_A中的兩列可以是覆蓋索引而不是單獨的索引。
嘗試了上述但解釋沒有改變 – 2011-05-11 07:10:45
column_A來自Table_A。 – 2011-05-11 07:59:25
還有更多建議嗎? – 2011-05-11 08:18:05
說明輸出 - | 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
@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
@jensgram - 更多建議? – 2011-05-11 08:17:45