一
问 题
从.5开始支持 ddl,5.6版本更加完善,一直到.0版本,支持了更多alter table语句通过 ddl快速的执行,在执行效率、降低锁表时间以及IO消耗上有了很大的提升。
在日常运维MySQL时,ddl执行的最多的大概就是扩展字段长度的情况,但是面对一定数据量的表,在执行时间上有时很快,有时执行起来很慢,这是什么原因?
二
测 试
2.1 创建表t1
表字符集为。
插入一些测试数据:
2.2 执行ddl命令
首先,name字段长度由30扩展至50。
再把name字段长度由50扩展至90。
可以看到两次ddl的执行时间差异很大, 造成差异的原因是什么呢?
通过MySQL官方文档得知,这跟的字段所占用的字节数有关。
通过上面的例子分析,(30) 占用了30个字符,字符集为每个字符4个字节,共占用120个字节,(50) 占用了200个字节,而(90)占用了360个字节,(30)到(50)不涉及跨字节范围,而从(50)到(90)则涉及到跨字节范围,所以后者不能通过 ddl执行语句,只能通过原始的方式去copy表执行,速度较慢。
2.3 验证结论
通过显示指定的方式,更加明显的看出,当涉及到跨字节范围时,MySQL会报错提示使用copy的方式执行alter table语句。通过使用copy的方式跨话字节范围后,再次指定 的方式,又可以进行 ddl了。
测试结论:
依据本例,(30)为占用120字节,如果确定不会超过256字节,可以根据实际需求创建小于等于(63);如果预估数据可能会超过256字节,就不要创建低于(64)的,这样方便以后字段扩展进行使用 ddl。
当然,不建议为了方便 ddl操作,将所有的字段长度都超过256字节,因为MySQL在加载内存临时表的时候,会将字段定义的所有的长度加载到内存中,而不是实际的长度,同样又会造成资源消耗。