全文链接:
https://www.modb.pro/db/23201
0 问题描述
SELECT
`post_title`,
`post_date`
FROM
post
WHERE
`post_status` = 'publish'
ORDER BY
view_count desc
LIMIT
5, 5
SELECT
*
FROM
post
WHERE
post_status = 'publish'
ORDER BY
view_count desc
LIMIT
5, 5
SELECT
`post_title`,
`post_date`
FROM
post
WHERE
`post_status` = 'publish'
ORDER BY
view_count desc,
ID asc
LIMIT
5, 5
但是事实就是,MySQL再order by和limit混用的时候,出现了排序的混乱情况。
1 分析问题
在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即 使用了priority queue。
就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是
只需要 sort buffer 少量的内存就可以完成排序。
是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。
MySQL 5.5 没有这个优化,所以也就不会出现这个问题。
(1) SELECT
( 2) DISTINCT <select_list>
( 3) FROM <left_table>
( 4) <join_type> JOIN <right_table>
( 5) ON <join_condition>
( 6) WHERE <where_condition>
( 7) GROUP BY <group_by_list>
( 8) HAVING <having_condition>
( 9) ORDER BY <order_by_condition>
( 10) LIMIT <limit_number>
……
查看全文请点击文章顶部链接