关于排序分页异常问题。

  • 【TiDB 版本】:v3.0.5
  • 【问题描述】:加了Limit与不加limit排序顺序不一致。

SELECT id,created_at,lottery_no FROM user_orders WHERE xxx=xxx AND xxx=xxx ORDER BY created_at desc, lottery_no desc;

SELECT id,created_at,lottery_no FROM user_orders WHERE xxx=xxx AND xxx=xxx ORDER BY created_at desc, lottery_no desc limit 10;

您好: 请尝试多次执行这个sql,返回值是否一致? SELECT id,created_at,lottery_no FROM user_orders WHERE xxx=xxx AND xxx=xxx ORDER BY created_at desc, lottery_no desc;

多次执行,结果是一样的。

麻烦您把建表语句和样例数据发我,我模拟一下问题,多谢

wind_test.sql.gz (783.8 KB)

附件是建表语句和数据,用mysqldump导出来的。

查询完整SQL是:

SELECT id,created_at,lottery_no FROM wind_test WHERE deleted_at IS NULL AND ( (account_name = ‘5_feb029’) AND (created_at >= ‘2020-03-10’) AND ( created_at <= ‘2020-03-10 23:59:59’ ) AND (site_id = 5) ) ORDER BY created_at desc, lottery_no desc;

SELECT id,created_at,lottery_no FROM wind_test WHERE deleted_at IS NULL AND ( (account_name = ‘5_feb029’) AND (created_at >= ‘2020-03-10’) AND ( created_at <= ‘2020-03-10 23:59:59’ ) AND (site_id = 5) ) ORDER BY created_at desc, lottery_no desc limit 10;

您好: 感谢反馈,测试和您的结果一致,我们分析有结论后,会尽快答复,多谢

1赞

好的,感谢。

  1. 这个现象是合理的 ,只对create_at,lottery_no排序时,对其他列不保序

  2. 不加 limit 时会把所有数据读到 TiDB 进行排序输出 这个排序过程不对其他列保序

  3. 加 limit 10 时 tikv 会使用top 算子 只返回其中的10条数据 其他数据会截断掉 这返回的10条数据也是随机的

另外我发现,多次分页数据有重复展示,这就不合理了。请看下面的示例,第二次分页数据在第一次里面出现过。

SELECT id,created_at,lottery_no FROM wind_test WHERE deleted_at IS NULL AND ( (account_name = ‘5_feb029’) AND (created_at >= ‘2020-03-10 00:00:00’) AND ( created_at <= ‘2020-03-10 23:59:59’ ) AND (site_id = 5) ) ORDER BY created_at desc, lottery_no desc limit 0,5;

SELECT id,created_at,lottery_no FROM wind_test WHERE deleted_at IS NULL AND ( (account_name = ‘5_feb029’) AND (created_at >= ‘2020-03-10 00:00:00’) AND ( created_at <= ‘2020-03-10 23:59:59’ ) AND (site_id = 5) ) ORDER BY created_at desc, lottery_no desc limit 5,5;

这个是合理的,每一次的查询都是不保证序列的,如果你要id列也保序,那么你要在order 里加上id 列就可以了。

好的,我只能通过排序多加一个加id列,避免这种问题了。感谢。

不客气,欢迎下次继续交流