mysql数据库建表的基本规范
1、创建表的时候必须指定主键,并且主键建⽴后最好不要再有数据修改的需求
mysql从5.5版本开始默认使⽤innodb引擎,innodb表是聚簇索引表,也就是说数据通过主键聚集(主键下存储该⾏的数据,索引指向主键值),如下图所⽰:
正是由于这种解构,如果后续对主键对应的值进⾏修改,就会导致索引节点的频繁分裂,性能会下降⾮常厉害。因此推荐开发的同事们使⽤和业务没有任何关联的⾃增id来做主键(切记不要使⽤uuid来做主键),此外也可以考虑使⽤其他的⽅式来⽣产⾃增的ID,⽐如使⽤Twitter 的snowflake算法或者zk的DistributedAtomicLong来间接实现。使⽤⾃增主键⽽不是uuid做主键的优点主要有如下⼏点:
a、占⽤的数据量更⼩
b、数据顺序递增,不会导致索引节点的频繁分裂
c、数字类型⽐字符类型效率更⾼
正确招式:使⽤⾃增id作为主键
2、创建表选择字段的时候,在符合业务需求的情况下尽量⼩,数据类型尽量简单
数据类型尽量简单很好理解,⽐如,使⽤数字类型要⽐使⽤字符类型效率更⾼,因为不涉及到校对规则和字符集。⽽字段尽量⼩,说的是在满⾜业务需求的情况下,尽可能⼩。这么做的好处是:更⼩的字段类型占⽤更少的内存,占⽤更少的磁盘空间,占⽤更少的磁盘IO,以及占⽤更少的带宽。举个例⼦,如果⼀个varchar(50)的字段,不管你存储了⼏个字符,在查询的时候仍然需要申请50 byte的内存
3、创建表的时候显式申明存储引擎
这个没什么说的,使⽤什么引擎就申明什么引擎,防⽌被默认。有句话说得好:如果你不选择,那你就被选择,被选择的结果不⼀定是你⾃⼰想要的。命运还是要掌握的⾃⼰⼿⾥。
正确招式:显式申明ENGINE=xxxx;
4、创建表的时候显式申明字符集
如果不不想被乱码困扰,就⽼⽼实实的申明字符集,还是那句话:如果你不选择,那你就被选择,被选择的结果不⼀定是你⾃⼰想要的。命运还是要掌握的⾃⼰⼿⾥。
正确的招式:显式申明DEFAULT CHARSET=xxxx;
5、创建表的时候对经常要查询的列添加索引或者组合索引
索引直接影响后⾯的查询性能,尤其是数据量越⼤的时候,影响越明显。作为⼀个从事DBA⽣涯超过5年的DBA,遇到过⽆数次由于没有添加索引,导致的线上故障,请各位开发和DBA的同事谨记,⼀定要对经常要查询的列添加索引或者组合索引,防⽌线上事故的发⽣。
mysql创建表数据类型正确招式:建表的时候就添加对应INDEX
6、创建表的时候对字段和表添加COMMENT
这个主要是⽅便后续的维护,之前在⼩公司做DBA的时候,接⼿数据库时由于没有任何的COMMENT,导致完全不知道对应的表和字段是做什么⽤的,不得不经常⿇烦开发的同事解释。这个⼩技巧⽤⼀个经典的⼴告词来解释就是:你好,我也好。
正确招式:对列和表都添加COMMENT做详细说明;
7、创建表的时候不要添加drop操作
有的开发同事在创建表之前喜欢添加, DROP TABLE IF EXISTS TABLEXXXX; 然后再来个CREATE TABLE,建议不要这么⼲,因为我之前遇到过由此带来的线上故障。将线上正在使⽤的表drop掉了。建议⼤家创建表的时候修改为:CREATE TABLE IF NOT EXISTS TABLEXXX .......;
正确招式:CREATE TABLE IF NOT EXISTS TABLEXXX .......;
8、创建表的时候,字段尽量不要为NULL
解决办法就是设置字段为NOT NULL,并设置字段的默认值。字段尽量不要为NULL的原因如下:
a、NULL需要占⽤额外的空间存储;
b、进⾏⽐较的时候会更复杂,还会导致你select (column)的时候不准确
c、含有NULL值的列,会对SQL优化产⽣影响,尤其是组合索引中
具体NULL会带来的问题⼤家可以查阅:
正确招式:NOT NULL DEFAULT 'xxxxx';
附上1个机器简单的标准SQL 范例,⼤家创建表的时候可以参照下⾯的范例SQL来创建,范例如下:CREATE DATABASE IF NOT EXISTS `dev_ops_db`;
CREATE TABLE IF NOT EXISTS `dev_ops_db`.`monitor_table_holiday` (
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
`holiday_date` date NOT NULL default '1999-01-01' COMMENT '节假⽇⽇期',
`holiday_name` varchar(36) NOT NULL default '' COMMENT '节假⽇名称',
PRIMARY KEY (`id`),
KEY `holiday_date` (`holiday_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='节假⽇数据表';
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论