问题描述
我在MySQL中有一个具有5万行的表,最近又添加了一个新索引。当我运行时(显示表中每个索引的大小):
SELECT database_name,table_name,index_name,ROUND(stat_value * @@innodb_page_size / 1024 / 1024,2) size_in_mb
FROM mysql.innodb_index_stats
WHERE table_name = 'table_name' and stat_name = 'size'
ORDER BY size_in_mb DESC;
它为我新创建的索引显示1.5 mb。这是否意味着MySQL在创建新索引时自动为现有表建立索引,还是必须使用OPTIMIZE TABLE
或类似命令手动为它重新建立索引?我正在使用InnoDB(版本5.7.26)。
从速度角度来看,它似乎根本没有改善查询的性能,这就是为什么我认为重新索引是必要的。
解决方法
这是否意味着当我创建新索引时,MySQL自动为现有表建立索引?
是的,确实如此。它扫描表中的现有数据并相应地创建索引。如果要创建unique
索引,还可以确保数据满足唯一性约束,否则将失败。
我是否必须使用
OPTIMIZE TABLE
手动为其重新编制索引?
新创建的索引可能不会使立即optimize table
受益。这样做仍然是一个好主意,因为该命令将重组表本身以及其他索引(如果有)的存储。
创建索引也将建立索引。索引创建数据定义语言被视为online DDL.