自增ID排序问题

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:3.0.8
  • 【问题描述】:开发人员反应有张表的ID列不连续,且查询时默认排序ID列的排序结果不正确。

表结构:

    CREATE TABLE `sms_sign_conf` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sign_name` varchar(25) NOT NULL DEFAULT '' COMMENT '签名名字,应保持唯一',
  `channel` varchar(25) NOT NULL DEFAULT '' COMMENT '签名简拼',
  `sign_len` tinyint(2) NOT NULL DEFAULT '0' COMMENT '签名字符长度',
  `create_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=120017/*!90000 SHARD_ROW_ID_BITS=4 PRE_SPLIT_REGIONS=3 */

SQL语句:

mysql> select id,from_unixtime(create_at) from sms_sign_conf;
+-------+----------------------------+
| id    | from_unixtime(create_at)   |
+-------+----------------------------+
| 60017 | 2020-04-24 10:58:41.000000 |
|     1 | 2018-11-29 19:56:00.000000 |
|     2 | 2018-11-29 19:56:00.000000 |
|     3 | 2018-11-30 17:18:16.000000 |
|     4 | 2018-11-30 17:21:11.000000 |
|     5 | 2018-11-30 17:22:39.000000 |
|     6 | 2018-11-30 17:24:38.000000 |
|     7 | 2018-11-30 17:38:12.000000 |
|     8 | 2018-12-03 10:34:22.000000 |
|     9 | 2018-12-03 10:34:42.000000 |
|    10 | 2018-12-03 10:35:00.000000 |
|    11 | 2018-12-03 10:35:18.000000 |
|    12 | 2018-12-03 10:35:47.000000 |
|    13 | 2018-12-03 10:36:19.000000 |
|    14 | 2018-12-03 10:36:35.000000 |
|    15 | 2018-12-03 10:36:48.000000 |
|    16 | 2019-11-01 10:23:37.000000 |
|    17 | 2020-03-16 15:01:13.000000 |
| 90017 | 2020-04-24 11:02:13.000000 |
+-------+----------------------------+

问题1:id列没有正确排序

问题2:id=60017,id=90017跳跃了30000个值。查询相关资料后发现tidb-server在重启后缓存的id区间会失效,需要重新获取。但是我的情况是此时的tidb-server没有重启,检查tidb-server的日志也没有发现问题,id自增值居然自动跳跃了30000个值。

你好,

id 不连续是预期的,排序不顺序也是预期的,建议使用 order by 进行排序查询

我们内部并没有对其他列进行保序的逻辑,仅仅对排序列进行排序

如果要 id 也保序 就把 id 添加到 order by 列…

好的,多谢。:ok_hand:

ok,有问题开新帖继续讨论,选个最佳答案把