根据以前写的文章内容,结合网上找到的资料,整理出下面的MySql数据库规范做为参考。数据库
数据库命名规范
- 全部的数据库对象名称(包括库名、表名、列名等等)必须以小写字母命名,每一个单词之间用下划线分割
- 全部的数据库对象名称禁止使用MySQL保留关键字
- 数据库对象的命名要能作到见名知意,而且不要超过32个字符
- 数据库中用到的临时表以tmp为前缀并以日期为后缀
- 数据库中用到的备份表以bak为前缀并以日期为后缀
- 在不一样的库或表中,要保证全部存储相同数据的列名和列类型必须一致
数据库基本设计规范
- 全部表若是没有特殊需求,都要使用Innodb存储引擎。Innodb存储引擎支持事务、行级锁、更好的恢复性、高并发下性能更好。
- 数据库和表的字符集统一使用UTF8字符集,避免因为字符集的转换产生乱码。
- 全部的表和字段都须要添加注释。使用comment从句添加表和列的备注,从一开始就把数据字典维护好
- 控制单表数据量的大小,建议控制在500万行之内。
能够采用历史数据归档(常见于日志表)和分库分表的方式控制单表数据的大小。
- 谨慎使用MySQL分区表,避免跨分区查询,不然效率很低。
分区表在逻辑上表现为一个表,可是在物理上将数据存储在多个文件。最好能将分区表的不一样分区文件存储在不一样的磁盘阵列上。
- 表中的列不要太多,尽可能作到冷热数据分离,减少表的宽度。
减小表的宽度,可让一页内存中容纳更多的行,进而减小磁盘IO,更有效的利用缓存。
- 常常一块儿使用的列尽可能放到一个表中,避免过多的关联操做。
- 禁止在表中创建预留字段。
修改列的类型会所锁表。修改一个字段类型的成本要高于增长一个字段。
- 禁止在数据库中存储图片、文件等
数据库字段设计规范
- 优先为表中的每一列选择符合存储须要的最小的数据类型
列的字段类型越大,创建索引占据的空间就越大,致使一个页中的索引越少,形成IO次数增长,影响性能。
- 每一个字段尽量具备NOT NULL属性
- 避免使用Blob、Text及ENUM类型
- 使用datetime、timestamp存储时间类型,禁止使用字符串替代
- 使用数字类型存储IP地址,用INET_ATON、INET_NTOA能够在IP地址和数字类型间转换。
- VARCHAR类型的长度应该尽量短。
VARCHAR类型虽然在硬盘上是动态长度的,可是在内存中占用的空间是固定的最大长度。
数据库索引设计规范
- 限制每张表上的索引数量,建议单张表索引不超过5个
索引并非越多越好。索引能够提升查询的效率,但会下降写数据的效率。有时很差的索引还会下降查询的效率。
- 禁止给表中的每一列都创建单独的索引。设计良好的联合索引比每一列上的单独索引效率要高出不少。
- 每一个Innodb表都必须有一个主键,且不使用更新频繁的列做为主键,不使用多列主键。不使用UUID、MD五、字符串列做为主键。最好选择值的顺序是连续增加的列做为主键,因此建议选择使用自增ID列做为主键
- 建议在下面的列上创建索引:
在SELECT,UPDATE,DELETE语句的WHERE从句上的列。在ORDER BY,GROUP BY,DISTINCT上的列。多表JOIN的关联列。
- 区分度最高的列放在联合索引的最左侧。使用频繁的列放在联合索引的最左侧。
- 避免冗余的索引,如:primary key(id),index(id),unique index(id)
- 避免重复的索引,如:index(a,b,c),index(a,b),index(a)
重复的和冗余的索引会下降查询效率,由于MySQL查询优化器会不知道该使用哪一个索引。
- 不要依靠外键保证参照完整性,在业务端实现参照完整性的要求。创建外键约束后的表在插入数据时要进行数据参照完整性检查,这会致使消耗数据库性能。虽然不使用MySql自带的外键,但必定在表与表之间的关联键上创建索引。
数据库SQL开发规范
- 在程序中,建议使用预编译语句进行数据库操做。预编译只编译一次,屡次使用,比SQL效率高。
- 避免数据类型的隐式转换。隐式转换会致使索引失效。
- 避免使用双%号或前置%号的查询条件,这样没法利用到索引。
- 禁止在查询中使用select *
- 避免使用子查询,子查询会产生临时表,临时表没有任何索引,数据量大时严重影响效率。建议把子查询转化成关联查询。
- 避免使用JOIN关联太多的表。
- 尽可能减小同数据库的交互次数,数据库更适合处理批量操做。
- 使用IN代替OR
- 禁止在where从句中对列进行函数转换和计算,会致使索引无效。
- 在不须要去重的状况下,要使用UNION ALL代替UNION。