mysql的表如何重新组织(或生成)索引?

发布于 2022-09-04 21:14:19 字数 1475 浏览 11 评论 0

1,背景描述
我有一个user表,表结构如下:
clipboard.png
索引如下:
clipboard.png
表中数据如下:
clipboard.png

可以看到表中数据是按lastname排序的,这是因为在lastname, familyname, city上有一个多列索引,userid上的主键(索引)是后加的,所以userid是无序的。
mysql当中有没有一种方法可以重新生成(或组织)索引,让select userid, lastname from user这条语句的查询结果默认是按userid排序?

注意:不是强制使用索引select userid, lastname, from user force index(primary),而是重新生成或组织索引(reorganize)。


4月29日更新

其实,我这里是想问mysql是不是有某个命令可以对表中已有的索引进行重新组织,就是在表经过一段时间的更新、删除、插入操作后,数据会发生变化(结构不变),那么表的索引也就相应的会发生各种变化(比如底层的碎片等),那么是不是有一种方法可以对这些索引重新组织或者重新生成,再不然就只能删除索引再重建索引。


5月2日更新
我把最初提问的问题增加了删除线,开始的提问有些问题,特别是这儿的描述是错误的:“可以看到表中数据是按lastname排序的,这是因为在lastname, familyname, city上有一个多列索引,userid上的主键(索引)是后加的,所以userid是无序的可以看到表中数据是按lastname排序的,这是因为在lastname, familyname, city上有一个多列索引,userid上的主键(索引)是后加的,所以userid是无序的”,至于为什么是无序的,@clcx_1315已经回答了,而且他也指出即便重新组织(生成)索引,这句select userid, lastname from user也是无法实现让userid有序的。我百度了下,mysql当中好像没有专门用于重新生成或组织索引的命令,sql server数据库倒是有,感兴趣的朋友百度吧。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

忘东忘西忘不掉你 2022-09-11 21:14:20

我正好总结了一篇笔记文章, 你想问的是这个吗 ?

[mysql重置自增ID | 数据库中的id列重新开始排序

森林很绿却致人迷途 2022-09-11 21:14:19

mysql有optimize table的用法,但是同时也把表重组了。
如果系统有明显的业务低峰期,删掉索引重建也是可以的。

掩于岁月 2022-09-11 21:14:19

这种情况是因为你主键外的其他列是一个复合索引,你查询的时候mysql就直接走索引表找到你的所有数据(mysql innodb普通索引会将主键信息一并存储),所以就是按照你索引首字段排序检索,他并不是按照录入磁盘顺序读取全表的,而主键则是按照磁盘录入顺序添加的,因此在磁盘上是顺序的,但是你读取的时候读的是索引表才会是不连续的
要改变这种状况的话你重建表也是一样的,仍然会按lastname得索引排序,除非你按照lastname的顺序录入
另外一个办法就是添加一个冗余字段,这时候再select全表的时候就不会走你的覆盖索引查询而是走全表扫描,当然就会主键渐顺序排列了。

若能看破又如何 2022-09-11 21:14:19

我记得mysql也会根据你的索引情况自动对索引进行重建,具体根据什么也没查到。
留待有缘人解答

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文