索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。

    重建索引
    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单位字节

    1. [root@localhost][employees]: select * from information_schema.tables where table_name='employees'\G
    2. *************************** 1. row ***************************
    3. TABLE_CATALOG: def
    4. TABLE_SCHEMA: employees
    5. TABLE_NAME: employees
    6. TABLE_TYPE: BASE TABLE
    7. ENGINE: InnoDB
    8. VERSION: 10
    9. ROW_FORMAT: Dynamic
    10. TABLE_ROWS: 290137
    11. AVG_ROW_LENGTH: 54
    12. DATA_LENGTH: 15777792
    13. MAX_DATA_LENGTH: 0
    14. INDEX_LENGTH: 9977856
    15. DATA_FREE: 7340032
    16. AUTO_INCREMENT: NULL
    17. CREATE_TIME: 2019-10-14 07:40:27
    18. UPDATE_TIME: NULL
    19. CHECK_TIME: NULL
    20. TABLE_COLLATION: utf8mb4_general_ci
    21. CHECKSUM: NULL
    22. CREATE_OPTIONS:
    23. TABLE_COMMENT:
    24. 1 row in set (0.16 sec)
    25. [root@localhost][employees]: alter table employees engine=InnoDB;
    26. Query OK, 0 rows affected (27.10 sec)
    27. Records: 0 Duplicates: 0 Warnings: 0
    28. [root@localhost][employees]: select * from information_schema.tables where table_name='employees'\G
    29. *************************** 1. row ***************************
    30. TABLE_CATALOG: def
    31. TABLE_SCHEMA: employees
    32. TABLE_NAME: employees
    33. TABLE_TYPE: BASE TABLE
    34. ENGINE: InnoDB
    35. VERSION: 10
    36. ROW_FORMAT: Dynamic
    37. TABLE_ROWS: 299329
    38. AVG_ROW_LENGTH: 57
    39. DATA_LENGTH: 17317888
    40. MAX_DATA_LENGTH: 0
    41. INDEX_LENGTH: 5783552
    42. DATA_FREE: 2097152
    43. AUTO_INCREMENT: NULL
    44. CREATE_TIME: 2021-07-28 10:39:41
    45. UPDATE_TIME: NULL
    46. CHECK_TIME: NULL
    47. TABLE_COLLATION: utf8mb4_general_ci
    48. CHECKSUM: NULL
    49. CREATE_OPTIONS:
    50. TABLE_COMMENT:
    51. 1 row in set (0.01 sec)