您的位置:首页 > 数据库 > MySQL

《高性能mysql》之Schema与数据类型优化(第四章)

2017-03-13 21:08 489 查看
①简单原则
     更小通常更好、简单就好、尽量避免NULL

②数据类型选择
     -- 整型:尽量使用unsigned(不允许负值),且选择合适大小的整型数据,表如下:
数据类型大小M

(默认值)
范围(有符号)范围(无符号)用途
tinyint [(M)] [UNSIGNED] [ZEROFILL]1字节4-128~127  (-27~27-1)0 ~ 255 (0 ~ 28-1)非常小整数值
smallint [(M)] [UNSIGNED] [ZEROFILL]2字节6-32768~32767(-215 ~ 215-1)0 ~ 65535 (0 ~ 216-1) 较小整数
mediumint [(M)] [UNSIGNED] [ZEROFILL]3字节9-8388608 ~ 8388607 (-223 ~ 223-1)0 ~ 16777215 (0 ~ 224-1) 中等大小整数
int [(M)] [UNSIGNED] [ZEROFILL]4字节 11-2147483648 ~ 2147483647(-231 ~ 231-1)0 ~ 4294967295 (0 ~ 232-1) 标准整数
[b]bigint[/b] [(M)] [UNSIGNED] [ZEROFILL]8字节20-9223372036854775808 ~9223372036854775807

(-263 ~ 263-1)
0 ~ 18446744073709551615

(0 ~ 264-1)
 较大整数
     -- 实数:带小数部分数字
          如:float(4个字节、11个数字)、double(8个字节,20个数字)、decimal(在mysql5.0以上允许65个数字)
          注:如计算精确数字,使用decimal(像财务)

     -- 字符串类型:VARCHAR和CHAR
          VARCHAR:可变长字符串,比定长省空间(需一个字节记录长度),推荐使用,但update时可能使行变得比原来长
          CHAR:定长,对于md5数据合适存储(较短数据且固定长度)
          注:慷慨是不明智,需要多少分配多少,如手机号11位则分配 11
          BLOB和TEXT:常用存储的字符串数据
               缺点:Innodb中当数据行中有以上两个会使用磁盘临时表,解决办法是避免使用该两种类型
     -- 枚举:ENUM把不重复字符串存储成一个预定义集合,例子如下:
          


          注:枚举常量尽量避免常量

     -- 日期和时间类型:
          TIMESTAMP:只能表示1970-2038年,  时间依赖时区(如中国需要设置为中国时区),插入时可自动更新
          注:TIMESTAMP效率比DATETIME高
     -- 位数据类型:含BIT、SET(具体不做介绍)

     -- 选择标识符:
           整数一般是标识列最好的选择,可用auto_increment

③MySQL设计中陷阱:
     -- 太多的列
     -- 太多的关联:每个关联操作最多61张表,根据经验,若需要执行快并发好,单个查询最好在12个表内关联
     --
注意过度使用枚举
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: