2013-11-04 59 views
0

我需要從項目列表中選擇50個滿足搜索條件的項目。 我還需要當前銷售量。 項目列表已經超過10萬條記錄選擇後的Mysql加入

這就是我現在做的事:

SELECT 
    items.id, 
    CONCAT(prod_codes.code,items.item) AS item, 
    items.price, 
    sold.count 
FROM items 
LEFT JOIN prod_codes ON items.prod_code_id=prod_codes.id 
LEFT JOIN (
    SELECT COUNT(*) AS count,CONCAT(prod_code,part_num) AS part 
    FROM `sold_items` 
    WHERE 1 
    GROUP BY CONCAT(prod_code,part_num) 
    ORDER BY count DESC 
) AS sold ON sold.part=CONCAT(prod_codes.code,items.item) 
WHERE active_status=1 
AND CONCAT(items.prod_code,items.item) collate utf8_general_ci LIKE '%".$search_part."%' 
AND items.description collate utf8_general_ci LIKE '%".$search_desc."%' 

ORDER BY items.item 

LIMIT 50 

但這個查詢需要在20秒內執行。我相信有更好的方法來做到這一點。

+0

爲什麼'GROUP BY CONCAT(prod_code,part_num)'而不是'GROUP BY prod_code,part_num'? –

回答

0

代替嵌套子查詢,你可以試試這個:

SELECT 
    items.id, 
    CONCAT(prod_codes.code,items.item) AS item, 
    items.price, 
    COUNT(*) AS count 
FROM items 
LEFT JOIN prod_codes ON items.prod_code_id = prod_codes.id 
LEFT JOIN sold_items sold ON sold.prod_code = prod_codes.code AND sold.part_num = items.item 
WHERE active_status = 1 
AND CONCAT(items.prod_code,items.item) collate utf8_general_ci LIKE '%".$search_part."%' 
AND items.description collate utf8_general_ci LIKE '%".$search_desc."%' 
ORDER BY items.item 
GROUP BY prod_codes.code, items.item, items.id, items.price 
LIMIT 50 
0

替換的這部分內容的WHERE子句

CONCAT(items.prod_code,items.item) collate utf8_general_ci LIKE '%".$search_part."%' 

與此:

(items.prod_code collate utf8_general_ci LIKE '%".$search_part."%' OR items.item collate utf8_general_ci LIKE '%".$search_part."%') 

這CONCAT()調用幾乎肯定會讓它停滯不前,因爲它不能使用索引。

此外,您有SQL注入問題等 - 使用prepared statements

最後,請參閱@ ypercube的評論;這也是一個很好的觀點,並且會產生很大的影響。

+0

但這和第一個不一樣。任何人,即使你完全忽視CONCAT零件,它仍然很慢(僅搜索py部件號) – AnKing

+0

您是否嘗試過我的更改和@ ypercube的更改?這兩個CONCAT()調用都是問題。 –

+0

任何包含'*'字段(如'%search%')的搜索都不使用索引。因此,一個真正的增強將是一個搜索開始於*字段,如'搜索%'* –