MySQL使用LIMIT时的排序异常问题技术问询
MySQL排序异常问题解答
这不是MySQL的bug,核心原因是当排序字段存在重复值时,仅依赖该字段排序无法保证结果顺序的稳定性。
问题根源
你的查询仅用experience asc排序,当多条记录的experience值相同时,MySQL不会固定这些记录的相对顺序。数据库执行查询时,可能会根据数据存储位置、执行计划(比如是否使用索引、内存排序还是磁盘排序)的差异,对相同排序键的记录做不同排列。而LIMIT参数的变化可能触发不同的执行计划,进而导致相同记录在结果中的位置改变。
解决方案
在ORDER BY子句中添加一个唯一字段(比如主键id),让排序规则明确且稳定。修改后的查询如下:
LIMIT 10的修改后查询:
select astrologers.id,astrologers.name,chat_online,online,experience from `astrologers` where `astrologers`.`status` = '1' order by experience asc, id asc limit 10;
LIMIT 3的修改后查询:
select astrologers.id,astrologers.name,chat_online,online,experience from `astrologers` where `astrologers`.`status` = '1' order by experience asc, id asc limit 3;
添加id asc后,当experience值相同时,会按id升序排列,无论LIMIT设置为多少,相同experience的记录顺序始终一致,就能得到你预期的结果。
内容的提问来源于stack exchange,提问作者Satish Gupta
相关产品推荐
相关产品推荐

