子查询的MySQL自定义排序会影响性能

时间:2015-04-07 22:57:34

标签: mysql sorting

我有一张表,我可以从中返回搜索结果并按特定顺序显示它们。此示例是我的数据库结构的精确简化版本: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内存中对它们进行排序?

非常感谢帮助

1 个答案:

答案 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)

提高分拣性能。