MySQL优化班13期课后作业,20180828

了解InnoDB存储特点之后,InnoDB表的DDL设计上有什么要注意的吗
已邀请:

nineuping

赞同来自:

数据类型应选择最小、最短,可以节省内存、磁盘空间,减少IO。
选择和业务无关的整型(int、bigint)自增列作为主键。
表的字段不要过多。
BLOB、TEXT等大字段拆分出去单独存放,再用主键做关联。
所有列不允许为空。
考虑对经常参与join、排序、分组操作的列建立索引。

aaron8219 - Oracle DBA

赞同来自:

1. 设置显式主键(业务非相关的列),最好是int/bigint unsign的自增列,可以占用较少空间并有序排列,写入效率高
2. 主键尽量不要更新,索引page中的对应row会删除并重建,导致二级索引也一起更新,导致性能下降
3. 尽量避免使用BLOB,TEXT等字符类型,如果一定要使用,那就要采用dynamic/compressed的行格式,可以利用fully off-page的特性,只在page中存储1个20字节的指针指向溢出的page,使page中有更多的空间存储其他数据类型的行(一般而言1个page中能容纳的行越多,性能越好)
4. 如果某些列(char/varchar等字符型的列)存储的字段长度较长(当一行数据超过8k时,会产生行溢出,读取该行会加载更多的page到内存,使性能下降),可以考虑通过垂直拆分等手段来避免,也推荐采用dynamic/compressed的行格式,因为compact模式也要存下768字节以后,才会将多余的部分放到off-page中去
 

liyh

赞同来自:

1. 要有显示的主键,最好是int,bigint 数值类型,自增长,这样没错插入数据都是顺序写入page,不许额外维护链表指针。并且,数值类型占用字节少,int 4字节,bigint 8字节。主键字节越少,辅助索引大小也会变小,因为辅助索引似乎带着主键索引值的。
2.表设计时,不要太宽,列不要太多,或者不要存储过多的大对象。如果列宽超过了1/2 page ,就会产生溢出,将大对象列溢出当且page。这样没错对表数据操作时,IO会大大增加。
3.表字段长度,在允许范围内优先选用定长,保证列对齐,这样当数据有删除的时候,删除链表内的空间容易被重用,减少碎片空间。
4.不要对主键列进行修改,因为主键列修改,page内的数据指针会发生变化,会删除原来数据,重新插入,代价较大。结合第一条,主键要选择没有含义的自增id,这样可以尽量或者不对主键进行修改。

要回复问题请先登录注册