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

yangtoude
  • 326

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数据库倒是有,感兴趣的朋友百度吧。

回复
阅读 7k
4 个回答

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏