我需要从项目列表中选择50个满足搜索条件的项目。我还需要他们在销售的当前数量。项目列表有超过100,000条记录
这就是我现在要做的:
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秒的时间来执行。我相信有更好的方法可以做到这一点。
发布于 2013-11-05 03:06:03
替换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的评论;这也是一个很好的观点,并将产生很大的影响。
https://stackoverflow.com/questions/19774740
复制相似问题