InnoDB Plugin特性介绍-2:快速DDL

InnoDB Plugin在快速DDL上做了一些改进,在做的实验中看到,创建secondary indexes时,大约快了20%。

1. 原理

在MySQL5.0里面,如果数据表的记录数很多,增加和删除索引是非常慢的。CREATE INDEX and DROP INDEX命令是通过先创建一个空的临时表,这个表就是你新增或删除索引后的结构,然后把原表中的全部记录都拷贝(插入)到新的临时表中,最后把原表删除,临时表重命名成原表。

MySQL5.1的一些架构上的改变,可以简化上面的过程(不再需要逐行拷贝数据)。InnoDB Plugin利用这个改变,缩短了大多数情况下的索引变更时间。对InnoDB来说有两类索引:the clustered index and secondary indexes。因为InnoDB的主键是the clustered index,数据存放再此,所以,删除或者添加主键(the clustered index)逐行拷贝也是必须的。

InnoDB Pluing在删除一个secondary indexes时,先更改一下InnoDB内部数据字典和MySQL的数据字典,然后把释放的空间归还给InnoDB以供重复使用。如果是增加一个secondary indexes,还是有点复杂的,Plugin先将数据表中的数据取出到memory buffers或者临时表中,并按照新建索引列排好序,然后建立索引的B-Tree。实验表明,这样还是稍微快一些。

2. 实验

以下是一组关于secondary indexes对比数据:

ADD INDEX:

PluginFaster

Drop INDEX:

PluginFaster-2

以上图表纵坐标为秒,测试数据表有500万记录,ibd文件大小556M。(尝试了将tmp_table_size和max_heap_table_size设置成1G,效果并没有什么不同)

3. 小结

可以看到创建索引Plugin比Built-in大约快20%,而删除索引的速度,区别并不大。

实验的结果并没有理论上那么理想。

In:

2 responses to “InnoDB Plugin特性介绍-2:快速DDL”

  1. t

    good

  2. Bruce

    3. 小结

    可以看到创建索引Plugin比Built-in大约快20%,而删除索引的速度,区别并不大。

    实验的结果并没有理论上那么理想。

    我测试的时候,120W记录,build-in的删除一个符合索引(3字段)的,需要20分钟,plugin的基本不耗时,0。00秒。。
    和你说的还有点不一样。

Leave a Reply

Your email address will not be published. Required fields are marked *