索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。
重建索引
alter table t drop index id;
alter table t add index (id);
如果是主键,下面重建是错误的
alter table T drop primary key;
~~alter table T add primary key(id);~~
不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。
这两个语句,你可以用这个语句代替 : alter table T engine=InnoDB。(也相当于把普通索引重建)
查看索引数据碎片率: DATA_FREE单位字节
[root@localhost][employees]: select * from information_schema.tables where table_name='employees'\G*************************** 1. row ***************************TABLE_CATALOG: defTABLE_SCHEMA: employeesTABLE_NAME: employeesTABLE_TYPE: BASE TABLEENGINE: InnoDBVERSION: 10ROW_FORMAT: DynamicTABLE_ROWS: 290137AVG_ROW_LENGTH: 54DATA_LENGTH: 15777792MAX_DATA_LENGTH: 0INDEX_LENGTH: 9977856DATA_FREE: 7340032AUTO_INCREMENT: NULLCREATE_TIME: 2019-10-14 07:40:27UPDATE_TIME: NULLCHECK_TIME: NULLTABLE_COLLATION: utf8mb4_general_ciCHECKSUM: NULLCREATE_OPTIONS:TABLE_COMMENT:1 row in set (0.16 sec)[root@localhost][employees]: alter table employees engine=InnoDB;Query OK, 0 rows affected (27.10 sec)Records: 0 Duplicates: 0 Warnings: 0[root@localhost][employees]: select * from information_schema.tables where table_name='employees'\G*************************** 1. row ***************************TABLE_CATALOG: defTABLE_SCHEMA: employeesTABLE_NAME: employeesTABLE_TYPE: BASE TABLEENGINE: InnoDBVERSION: 10ROW_FORMAT: DynamicTABLE_ROWS: 299329AVG_ROW_LENGTH: 57DATA_LENGTH: 17317888MAX_DATA_LENGTH: 0INDEX_LENGTH: 5783552DATA_FREE: 2097152AUTO_INCREMENT: NULLCREATE_TIME: 2021-07-28 10:39:41UPDATE_TIME: NULLCHECK_TIME: NULLTABLE_COLLATION: utf8mb4_general_ciCHECKSUM: NULLCREATE_OPTIONS:TABLE_COMMENT:1 row in set (0.01 sec)
