我有一张表,我可以从中返回搜索结果并按特定顺序显示它们。此示例是我的数据库结构的精确简化版本:http://www.java2s.com/Code/SQL/Select-Clause/Orderbyvaluefromsubquery.htm
这是我当前的代码,由于使用了子查询,但它在很大程度上影响了性能:
SELECT * FROM `table` AS p1
WHERE CONCAT(title,artist,creator,version) LIKE '%searchInput%'
ORDER BY
(SELECT
MAX(`rating`) FROM `table` AS p2 WHERE p1.setId=p2.setId
) DESC
上面的代码按集合中的最高评级搜索和排序结果集,并将同一组中的所有行保存在一起,例如:
id setId rating title,artist,etc...
1 1 5
2 1 5
3 2 7
4 1 6
5 2 1
6 3 3
将排序:
id setId rating title,artist,etc...
3 2 7
5 2 1
4 1 6
1 1 5
2 1 5
6 3 3
目前查询1000行需要大约8.5秒,大量行需要半分钟以上,是否有任何方法可以提高性能,或者更好地获取所有结果并在PHP内存中对它们进行排序?
非常感谢帮助
答案 0 :(得分:1)
你可以通过分离LIKE来加快速度:
SELECT p1.* FROM `table` AS p1
WHERE (title LIKE '%searchInput%')
OR (artist LIKE '%searchInput%')
OR (creator LIKE '%searchInput%')
OR (version LIKE '%searchInput%')
ORDER BY
(SELECT MAX(`rating`) FROM `table` AS p2 WHERE p1.setId=p2.setId) DESC
您也可以尝试
CREATE INDEX tbl_ndx ON table(setId, rating)
提高分拣性能。