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:
Drop INDEX:
以上图表纵坐标为秒,测试数据表有500万记录,ibd文件大小556M。(尝试了将tmp_table_size和max_heap_table_size设置成1G,效果并没有什么不同)
3. 小结
可以看到创建索引Plugin比Built-in大约快20%,而删除索引的速度,区别并不大。
实验的结果并没有理论上那么理想。
Leave a Reply