2014-03-05 48 views
0

我有一個小問題,我無法環繞我的頭。MySQL IN子句太慢,無法加入JOIN以正常工作

這個查詢完全符合我的需要,只需要永久性地殺死mysql守護進程。

"SELECT * 
FROM inventory 
WHERE 
    mac LIKE '%".$s."%' 
    OR uid IN (SELECT id FROM clients WHERE username LIKE '%".$s."%')" 

正確的方法是去JOIN子句,但不幸的是我不能得到它的工作。

基本上,我試圖搜索兩個表,然後根據mac地址或用戶名選擇記錄。

任何幫助,將不勝感激!

+1

也是「任何%」是一個性能殺手 – Strawberry

+0

@Strawberry:...還有'或' – zerkms

+0

你能不能在其他列搜索?有時我會創建額外的人造色譜柱來幫助搜索。 –

回答

1

這裏有一個辦法:

"SELECT i.* 
    FROM inventory i 
    LEFT 
    JOIN (SELECT c.id 
      FROM clients c 
      WHERE c.username LIKE '%".$s."%' 
      GROUP BY c.id 
     ) v 
    ON v.id = i.uid 
    WHERE i.mac LIKE '%".$s."%' 
    OR v.id IS NOT NULL" 

不是重新執行每個IN(子查詢),每行的庫存表這應該是顯著更有效。但是查詢仍然存在問題,因爲它必須對inventoryclients表中的每一行執行全面掃描。

+0

這很好用!不幸的是,我還是無法贊成......非常感謝! – user2446837

0
SELECT inventory.* 
FROM inventory LEFT JOIN clients ON (inventory.uid=clients.id) 
WHERE 
    mac LIKE '%".$s."%' OR username LIKE '%".$s."%' 
+0

只是幾個筆記;在OP查詢中,它僅從'庫存'返回列;這個查詢返回'inventory'和'clients'表中的列。另外,如果'clients'中有多於一行與'inventory.uid'匹配,那麼這將從庫存中返回「重複」行。 (OP查詢不這樣做。)在主鍵(或其他唯一的非空列)上添加GROUP BY將消除生成的重複項。 – spencer7593

+0

'uid'是'clients'表主鍵'id'的外鍵。作爲一個主要關鍵,根據定義它將是唯一的,所以沒有問題。 –

+0

我完全錯過了'id'列被定義爲'inventory'的主鍵。 – spencer7593