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,防止锁扩大
数据库就是数据库,不是计算器
读写分离,缓解在线库压力
合并写入、瞬间压力,分多次批量提交
本地写队列,防止意外崩溃丢失数据
垂直拆分,大数据字段独立拆分
水平拆分,冷热数据分离
数据压缩,在前端完成压缩
专用的统计库,分离线上应用
综合
最低授权:不开放非必要权限
资源预留:预留资源应付压力峰值
常见瓶颈:内存、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,防止锁扩大
相关文章推荐
- mysql设计规范之性能优化
- ”MySQL索引“学习总结
- MySQL慢查询的定位与优化
- MySQL中replace into语句的用法详解
- MySQL学习20:运算符与函数之自定义函数
- mysql 主从复制配置详解
- MySQL数据库十大优化技巧
- MySQL备份innodbackupex使用
- mysql 主从复制配置详解
- Mysql逻辑模块组成
- MySQL SQL语句优化的10条建议
- MySQL 主从同步容易出现的问题
- mysql show profiles使用分析sql性能
- MySQL索引的创建原则
- Mac下安装MySQL
- mysql索引总结----mysql 索引类型以及创建
- MySQL学习19:运算符与函数之信息函数、聚合函数、加密函数
- mysql数据库常用数据类型
- mysql数据库相关基本术语和概念
- MySQL在wamp中乱码的问题