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

mysql设计之开发规范

2016-06-06 00:00 531 查看
原则
数据库就是数据库,不是计算器
读写分离,缓解在线库压力
合并写入、瞬间压力,分多次批量提交
本地写队列,防止意外崩溃丢失数据
垂直拆分,大数据字段独立拆分
水平拆分,冷热数据分离
数据压缩,在前端完成压缩
专用的统计库,分离线上应用
综合
最低授权:不开放非必要权限
资源预留:预留资源应付压力峰值
常见瓶颈:内存、IO(磁盘、网络)
分散压力:数据和日志区分存储
发挥优势:别让数据库做它不擅长的事
保持优雅:越小(少)越好
区分冷热:冷热数据区分开
保持一致:和生产环境一致
开发环境
开发环境和生产环境尽可能保持一致
启用log_queries_not_using_indexes
设置long_query_time为最小阀值
启用micro-time补丁
定期检查分析slow log
授权和生产环境一致
关闭Query Cache
设置较小InnoDB Buffer Pool
数据对象
默认使用InnoDB,尽量不用MyISAM
不对InnnoDB表进行在线实时统计
InnoDB表显式指定自增INT型为主键
预先分库、分表或设定逻辑限制,减少在线单表数据量
以用户ID=N为例,取N/100%100=30,取N%100=20
则分配到DB30库下,分表TABLE20中
表字段设计:简单至上
INT/TIMESTAMP记录时间,而非DATETIME
IPV4地址用INT,而不是CHAR(15)
性别即使有不男不女,也要用ENUM(1,2,3),而不是INT,甚至CHAR
杜绝TEXT、BLOG,确实需要则拆分
存储较长字符串内容时,提前进行(物理、逻辑)压缩、序列化(JSON/BSON格式)
字段名显式而有意义,不用拼音,不用中文
表字段设计:简单至上
相同用途的字段,在各个表里的定义属性完全一致
显式约束:NOT NULL
指定默认值:DEFAULT ‘’
选择合适的类型,不要用CHAR存储INT值
字段长度足够就行
主键/唯一索性能引优于普通索引
复合索引比普通索引更合适
过度索引可能会带来灾难,够用就行
基数(cardinality)很小的列上不建索引
长字段使用部分索引,而非全部
冗余反向字段便于反向检索
采用第三方全文索引工具或者关键字(TAG)对TEXT/BLOB/CHAR字段检索
常用检索、排序字段,需要创建索引
SQL设计
简单SQL比复杂SQL高效
业务逻辑封装成存储过程
尽量不用子查询
减少使用复杂表连接
查询条件中不使用函数
用括号确定AND、OR优先级
查询条件加引号可能导致类型转换
不用FOR UPDATE和LOCK IN SHARE MODE,防止锁扩大数据库就是数据库,不是计算器
读写分离,缓解在线库压力
合并写入、瞬间压力,分多次批量提交
本地写队列,防止意外崩溃丢失数据
垂直拆分,大数据字段独立拆分
水平拆分,冷热数据分离
数据压缩,在前端完成压缩
专用的统计库,分离线上应用
综合
最低授权:不开放非必要权限
资源预留:预留资源应付压力峰值
常见瓶颈:内存、IO(磁盘、网络)
分散压力:数据和日志区分存储
发挥优势:别让数据库做它不擅长的事
保持优雅:越小(少)越好
区分冷热:冷热数据区分开
保持一致:和生产环境一致
开发环境
开发环境和生产环境尽可能保持一致
启用log_queries_not_using_indexes
设置long_query_time为最小阀值
启用micro-time补丁
定期检查分析slow log
授权和生产环境一致
关闭Query Cache
设置较小InnoDB Buffer Pool
数据对象
默认使用InnoDB,尽量不用MyISAM
不对InnnoDB表进行在线实时统计
InnoDB表显式指定自增INT型为主键
预先分库、分表或设定逻辑限制,减少在线单表数据量
以用户ID=N为例,取N/100%100=30,取N%100=20
则分配到DB30库下,分表TABLE20中
表字段设计:简单至上
INT/TIMESTAMP记录时间,而非DATETIME
IPV4地址用INT,而不是CHAR(15)
性别即使有不男不女,也要用ENUM(1,2,3),而不是INT,甚至CHAR
杜绝TEXT、BLOG,确实需要则拆分
存储较长字符串内容时,提前进行(物理、逻辑)压缩、序列化(JSON/BSON格式)
字段名显式而有意义,不用拼音,不用中文
表字段设计:简单至上
相同用途的字段,在各个表里的定义属性完全一致
显式约束:NOT NULL
指定默认值:DEFAULT ‘’
选择合适的类型,不要用CHAR存储INT值
字段长度足够就行
主键/唯一索性能引优于普通索引
复合索引比普通索引更合适
过度索引可能会带来灾难,够用就行
基数(cardinality)很小的列上不建索引
长字段使用部分索引,而非全部
冗余反向字段便于反向检索
采用第三方全文索引工具或者关键字(TAG)对TEXT/BLOB/CHAR字段检索
常用检索、排序字段,需要创建索引
SQL设计
简单SQL比复杂SQL高效
业务逻辑封装成存储过程
尽量不用子查询
减少使用复杂表连接
查询条件中不使用函数
用括号确定AND、OR优先级
查询条件加引号可能导致类型转换
不用FOR UPDATE和LOCK IN SHARE MODE,防止锁扩大数据库就是数据库,不是计算器
读写分离,缓解在线库压力
合并写入、瞬间压力,分多次批量提交
本地写队列,防止意外崩溃丢失数据
垂直拆分,大数据字段独立拆分
水平拆分,冷热数据分离
数据压缩,在前端完成压缩
专用的统计库,分离线上应用
综合
最低授权:不开放非必要权限
资源预留:预留资源应付压力峰值
常见瓶颈:内存、IO(磁盘、网络)
分散压力:数据和日志区分存储
发挥优势:别让数据库做它不擅长的事
保持优雅:越小(少)越好
区分冷热:冷热数据区分开
保持一致:和生产环境一致
开发环境
开发环境和生产环境尽可能保持一致
启用log_queries_not_using_indexes
设置long_query_time为最小阀值
启用micro-time补丁
定期检查分析slow log
授权和生产环境一致
关闭Query Cache
设置较小InnoDB Buffer Pool
数据对象
默认使用InnoDB,尽量不用MyISAM
不对InnnoDB表进行在线实时统计
InnoDB表显式指定自增INT型为主键
预先分库、分表或设定逻辑限制,减少在线单表数据量
以用户ID=N为例,取N/100%100=30,取N%100=20
则分配到DB30库下,分表TABLE20中
表字段设计:简单至上
INT/TIMESTAMP记录时间,而非DATETIME
IPV4地址用INT,而不是CHAR(15)
性别即使有不男不女,也要用ENUM(1,2,3),而不是INT,甚至CHAR
杜绝TEXT、BLOG,确实需要则拆分
存储较长字符串内容时,提前进行(物理、逻辑)压缩、序列化(JSON/BSON格式)
字段名显式而有意义,不用拼音,不用中文
表字段设计:简单至上
相同用途的字段,在各个表里的定义属性完全一致
显式约束:NOT NULL
指定默认值:DEFAULT ‘’
选择合适的类型,不要用CHAR存储INT值
字段长度足够就行
主键/唯一索性能引优于普通索引
复合索引比普通索引更合适
过度索引可能会带来灾难,够用就行
基数(cardinality)很小的列上不建索引
长字段使用部分索引,而非全部
冗余反向字段便于反向检索
采用第三方全文索引工具或者关键字(TAG)对TEXT/BLOB/CHAR字段检索
常用检索、排序字段,需要创建索引
SQL设计
简单SQL比复杂SQL高效
业务逻辑封装成存储过程
尽量不用子查询
减少使用复杂表连接
查询条件中不使用函数
用括号确定AND、OR优先级
查询条件加引号可能导致类型转换
不用FOR UPDATE和LOCK IN SHARE MODE,防止锁扩大数据库就是数据库,不是计算器
读写分离,缓解在线库压力
合并写入、瞬间压力,分多次批量提交
本地写队列,防止意外崩溃丢失数据
垂直拆分,大数据字段独立拆分
水平拆分,冷热数据分离
数据压缩,在前端完成压缩
专用的统计库,分离线上应用
综合
最低授权:不开放非必要权限
资源预留:预留资源应付压力峰值
常见瓶颈:内存、IO(磁盘、网络)
分散压力:数据和日志区分存储
发挥优势:别让数据库做它不擅长的事
保持优雅:越小(少)越好
区分冷热:冷热数据区分开
保持一致:和生产环境一致
开发环境
开发环境和生产环境尽可能保持一致
启用log_queries_not_using_indexes
设置long_query_time为最小阀值
启用micro-time补丁
定期检查分析slow log
授权和生产环境一致
关闭Query Cache
设置较小InnoDB Buffer Pool
数据对象
默认使用InnoDB,尽量不用MyISAM
不对InnnoDB表进行在线实时统计
InnoDB表显式指定自增INT型为主键
预先分库、分表或设定逻辑限制,减少在线单表数据量
以用户ID=N为例,取N/100%100=30,取N%100=20
则分配到DB30库下,分表TABLE20中
表字段设计:简单至上
INT/TIMESTAMP记录时间,而非DATETIME
IPV4地址用INT,而不是CHAR(15)
性别即使有不男不女,也要用ENUM(1,2,3),而不是INT,甚至CHAR
杜绝TEXT、BLOG,确实需要则拆分
存储较长字符串内容时,提前进行(物理、逻辑)压缩、序列化(JSON/BSON格式)
字段名显式而有意义,不用拼音,不用中文
表字段设计:简单至上
相同用途的字段,在各个表里的定义属性完全一致
显式约束:NOT NULL
指定默认值:DEFAULT ‘’
选择合适的类型,不要用CHAR存储INT值
字段长度足够就行
主键/唯一索性能引优于普通索引
复合索引比普通索引更合适
过度索引可能会带来灾难,够用就行
基数(cardinality)很小的列上不建索引
长字段使用部分索引,而非全部
冗余反向字段便于反向检索
采用第三方全文索引工具或者关键字(TAG)对TEXT/BLOB/CHAR字段检索
常用检索、排序字段,需要创建索引
SQL设计
简单SQL比复杂SQL高效
业务逻辑封装成存储过程
尽量不用子查询
减少使用复杂表连接
查询条件中不使用函数
用括号确定AND、OR优先级
查询条件加引号可能导致类型转换
不用FOR UPDATE和LOCK IN SHARE MODE,防止锁扩大
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: