一、MySQL存在的问题
优化器对复杂SQL支持不好
对SQL标准支持不好
大规模集群方案不成熟,主要指中间件
ID生成器,全局自增ID
异步逻辑复制,数据安全性问题
Online DDL
HA方案不完善
备份和恢复方案还是比较复杂,需要依赖外部组件
展现给用户信息过少,排查问题困难
众多分支,让人难以选择
二、数据库环境介绍
通常来讲,各个互联网公司的数据库分为5个数据库环境:
dev : 开发环境, 开发可读写,可修改表结构; 常用的163的数据库表; 开发人员可以修改表结构, 可以随意修改其中的数据; 但是需要保证不影响其他开发同事
qa : 测试环境, 开发可读写, 开发人员可以通过工具修改表结构
sim: 模拟环境, 开发可读写, 通过web平台;发起上线请求时,会先在这个环境上进行预执行, 这个环境也可供部署上线演练或压力测试使用 可以读写
real: 生产数据库从库(准实时同步),只读环境,不允许修改数据,不允许修改表结构; 供线上问题查找,数据查询等使用
online: 线上环境;开发人员不允许直接在线上环境进行数据库操作,如果需要操作必须找DBA进行操作并进行相应记录
这些环境的机器,一定要做到权限划分明确,读写帐号分离,并且有辨识度,能区分具体业务。例如用户名w_wap, r_wap 能看出来,读写帐号是wap应用的
三、数据库开发规范
开发规范本身也包含几部分:基本命名和约束规范,字段设计规范,索引规范,使用规范等
规范存在意义
保证线上数据库schema规范
减少出问题概率
方便自动化管理
规范需要长期坚持,对开发和DBA是一个双赢的事情
约束规范
表字符集选择UTF8 ,如果需要存储emoj表情,需要使用UTF8mb4(MySQL 5.5.3以后支持)
存储引擎使用InnoDB
变长字符串尽量使用VARCHAR VARBINARY
不在数据库中存储图片、文件
- 设计表的时候需要添加注释
单表数据量控制在1亿以下,单表物理大小不超过10GB,行平均长度不超过8KB
禁止在线上做数据库压⼒测试
禁止从测试、开发环境直连数据库
create database test_crm default character set=utf8;
基本命名规范
库名、表名、字段名禁止使用保留字
库名、表名、字段名、索引名使用小写字母,以下划线分割 ,需要见名知意
库名、表名、字段名、索引名不要设计过长,禁止超过32个字符,尽可能用最少的字符表达出表的用途
临时库、临时表名必须以tmp为前缀,并以日期为后缀
- 备份库、表必须以bak为前缀,并以日期为后缀
库名、表名、字段名、索引名使用名词作为数据库名称,并且只用英文,不用中文拼音
库名使用英文字母,全部小写,控制在3-7个字母以内
库名如果有多个单词,则使用下划线隔开,不建义驼峰命名
分表规范
禁止使用分区表
拆分大字段和访问频率低的字段,分离冷热数据
使用HASH进行散表,表名后缀使用十进制数,下标从0开始
按⽇期时间分表需符合YYYY[MM][DD][HH]格式
采用合适的分库分表策略
字段规范
所有字段均定义为NOT NULL ,除非你真的想存NULL,但是我想不到需要用Null的情况
字段类型在满足需求条件下越小越好,使用UNSIGNED存储非负整数 ,实际使用时候存储负数场景不多
使用TIMESTAMP存储时间,使用UNSIGNED INT存储IPv4 地址而不是CHAR(15) ,这种方式只能存储IPv4,存储不了IPv6
使用VARCHAR存储变长字符串 ,当然要注意varchar(M)里的M指的是字符数不是字节数;
使用DECIMAL代替FLOAT和DOUBLE存储精确浮点数
尽可能不用BLOB TEXT
使用TINYINT来代替ENUM类型,将字符转化为数字
禁止在数据库中存储明文密码
使用VARBINARY存储大小写敏感的变⻓字符串
索引规范
单个索引字段数不超过5,单表索引数量不超过5,索引设计遵循B+ Tree索引最左前缀匹配原则
选择区分度高的列作为索引,区分度高的放在前面
- 对字符串使用前缀索引,前缀索引长度不超过8个字符
建议优先考虑前缀索引,必要时可添加伪列并建立索引
建立的索引能覆盖80%主要的查询,不求全,解决问题的主要矛盾
DML和order by和group by字段要建立合适的索引
避免索引的隐式转换
避免冗余索引
- 关于主键:表必须有主键 ;不使用更新频繁的列 ;不选择字符串列 ;不使用UUID MD5 HASH ;默认使用非空的唯一键 ,建议选择自增或发号器
重要的SQL必须被索引:UPDATE、DELETE语句的WHERE条件列;ORDER BY、GROUP BY、DISTINCT的字段;多表JOIN的字段
核心SQL优先考虑覆盖索引
不在低基数列上建立索引,例如“性别”
不在索引列进行数学运算和函数运算
尽量不使⽤外键 ,外键用来保护参照完整性,可在业务端实现;对父亲和子表的操作会相互影响,降低可用性 ;INNODB本身对online DDL的限制
不使⽤%前导的查询,如like “%ab”
不使用负向查询,如not in/like "无法使用索引,导致全表扫描
隐式转换例子,字段定义为varchar,但传入的值是个int,就会导致全表扫描,要求程序端要做好类型检查
字段:remark varchar(50) NOT Null
mysql>SELECT id, gift_code FROM gift WHERE deal_id = 640 AND remark=115127;
1 row in set (0.14 sec)
mysql>SELECT id, gift_code FROM pool_gift WHEREdeal_id = 640 AND remark=‘115127’;
1 row in set (0.005 sec)
SQL类规范
使⽤预编译语句,只传参数,比传递SQL语句更高效,降低SQL注用概率
充分利用前缀索引
尽量不使用存储过程、触发器、函数等,让数据库做最擅长的事
避免使用大表的JOIN,MySQL优化器对join优化策略过于简单
避免在数据库中进行数学运算和其他大量计算任务
SQL合并,主要是指的DML时候多个value合并,减少和数据库交互
合理的分页,尤其大分页
UPDATE、DELETE语句不使用LIMIT ,容易造成主从不一致
使用in代替or,in的值不超过1000个
禁止使用order by rand()
sql语句避免使用临时表
使用union all而不是union
程序应有捕获SQL异常的处理机制
禁止单条SQL语句同时更新多个表
- 读取数据时,只选取所需要的列,不要每次都SELECT *,避免产生严重的随机读问题,尤其是读到一些TEXT/BLOB列
通常情况下,子查询的性能比较差,建议改造成JOIN写法
多表联接查询时,关联字段类型尽量一致,并且都要有索引
多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一定是全表数据量小的)作为驱动表
多表联接并且有排序时,排序字段必须是驱动表里的,否则排序列无法用到索引
多用复合索引,少用多个独立索引,尤其是一些基数(Cardinality)太小(比如说,该列的唯一值总数少于255)的列就不要创建独立索引了
类似分页功能的SQL,建议先用主键关联,然后返回结果集,效率会高很多
四、DBA规范
版本选择
MySQL社区版,用户群体最大
MySQL企业版,收费
Percona Server版,新特性多
MariaDB版,国内用户不多
建议选择优先级为:MySQL社区版 > Percona Server > MariaDB > MySQL 企业版
主要内容
SQL审核,DDL审核和操作时间,尤其是OnlineDDL
高危操作检查,Drop前做好数据备份
日志分析,主要是指的MySQL慢日志和错误日志
数据备份方案
Online DDL
原生MySQL执行DDL时需要锁表,且锁表期间业务是无法写入数据的,对服务影响很大,MySQL对这方面的支持是比较差的
推荐使用pt-online-schema-change
使用pt-online-schema-change的优点有:
无阻塞写入
完善的条件检测和延时负载策略控制
使用pt-online-schema-change的限制有:
改表时间会比较长(相比直接alter table改表)
修改的表需要有唯一键或主键
在同一端口上的并发修改不能太多
MySQL集群方案
基于主从复制;
基于中间件/proxy
基于NDB引擎
基于Galera协议
优先推荐MHA:可以采用一主多从,或者双主多从的模式,这种模式下,可以采用MHA或MMM来管理整个集群,最新的MHA也已支持MySQL 5.6的GTID模式了
MHA的优势很明显:
开源,用Perl开发,代码结构清晰,二次开发容易;
方案成熟,故障切换时,MHA会做到较严格的判断,尽量减少数据丢失,保证数据一致性;
提供一个通用框架,可根据自己的情况做自定义开发,尤其是判断和切换操作步骤;
支持binlog server,可提高binlog传送效率,进一步减少数据丢失风险。
不过MHA也有些限制:
需要在各个节点间打通ssh信任,这对某些公司安全制度来说是个挑战,因为如果某个节点被黑客攻破的话,其他节点也会跟着遭殃;
自带提供的脚本还需要进一步补充完善,当然了,一般的使用还是够用的。
拆分问题
解决单机写入压力过大和容量问题
有垂直拆分和水平拆分两种方式
拆分要适度,切勿过度拆分
有中间层控制拆分逻辑最好,否则拆分过细管理成本会很高
数据备份
全量备份 VS 增量备份
热备 VS 冷备
物理备份 VS 逻辑备份
延时备份
全量binlog备份
建议方式:
热备+物理备份
核心业务:延时备份+逻辑备份
全量binlog备份
主要做的几点:
备份策略集中式调度管理
xtrabackup热备
备份结果统计分析
备份数据一致性校验
采用分布式文件系统存储备份
备份系统采用分布式文件系统原因:
解决存储分配的问题
解决存储NFS备份效率低下问题
存储集中式管理
数据可靠性更好
【mysql】数据库使用的一些规范的更多相关文章
-
MySQL数据库设计与开发规范
目录 1. 规范背景与目的 2. 设计规范 2.1. 数据库设计 2.1.1. 库名 2.1.2. 表结构 2.1.3. 列数据类型优化 2.1.4. 索引设计 2.1.5. 分库分表.分区表 2.1 ...
-
关于mysql数据库涉及的一些规范
tips:如果本文对你有用,请爱心点个赞,提高排名,让这篇文章帮助更多的人.谢谢大家!比心❤~ 如果解决不了,可以在文末加我微信,进群交流. 设计规范,在分工协作的工作场景中尤其重要,否则团队之间互相 ...
-
MySQL数据库SQL修改数据规范
start transaction; select id,rname,free_course_ph,cmp_id,free_date_limit_ph from ebk_students WHERE ...
-
mysql 数据库设计规范
MySQL数据库设计规范 目录 1. 规范背景与目的 2. 设计规范 2.1 数据库设计 2.1.1 库名 2.1.2 表结构 2.1.3 列数据类型优化 2.1.4 索引设计 2.1.5 分库分表. ...
-
MySQL数据库基础(一)(启动/停止、登录/退出、语法规范及最基础操作)
1.启动/停止MySQL服务 启动:net start mysql 停止:net stop mysql 2.MySQL登录/退出 登录:mysql 参数:如果连接的是本地服务器,一般用命令:my ...
-
MySQL数据库开发规范知识点
前言: 设计规范更多的是为了确保数据库设计的合理性.为了项目最终的协调稳定性,而命名规范则更多的是为了确保设计的正式和统一. 约定优先于配置(Convention Over Configuration ...
-
MySQL 数据库规范--调优篇(终结篇)
前言 这篇是MySQL 数据库规范的最后一篇--调优篇,旨在提供我们发现系统性能变弱.MySQL系统参数调优,SQL脚本出现问题的精准定位与调优方法. 目录 1.MySQL 调优金字塔理论 2.MyS ...
-
MySQL数据库规范
Mysql数据库规范 一.基础规范 [强制]使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高[强制] ...
-
MySQL数据库基本规范整理
此篇文章是学习MySQL技术整理的,不足之处还望指教,不胜感激. 数据库基本规范涉及数据库命名规范.数据库索引设计规范.数据库基本设计规范.数据库字段设计规范.数据库SQL开发规范.数据库操作行为规范 ...
-
mysql 数据库 规范
目录 mysql 数据库 规范 基础规范 命名规范 表设计规范 字段设计规范 索引设计规范 SQL编写规范 行为规范 mysql 数据库 规范 基础规范 必须使用InnoDB存储引擎 解读:支持事务. ...
随机推荐
-
励志经典,持续收集ing....
士兵突击励志经典:http://blog.sina.com.cn/s/blog_660538e10100r7ld.html 励志散文1:http://www.vipyl.com/Article/328 ...
-
mysql 授权
cd /usr/local/mysql/bin/grant all privileges on *.* to 'root'@'%' identified by '12345678';flush pri ...
-
netbeans下将全部jar包打成一个,俗称fat jar
netbeans的java项目中.默认会将配置好的外部引用jar包,复制到dist文件夹的lib文件夹中去.假设须要公布出去.就须要将dist文件夹生成的jar和lib文件夹都拷贝出去公布,不方便. ...
-
InstallShield: cannot extract icon with index 0错误解决方案
在VS2012打包过程中,遇到这个错误,困扰我好几天,后来通过谷歌找到解决方案,如下: Expand the deploy solution (+) on the right panel (Solut ...
-
深入理解JavaScript,这一篇就够了
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
-
Machine Learning第十一周笔记:photo OCR
博客已经迁移至Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完毕了Cousera上Machine Learning的最后一周课程.这周介绍了 ...
-
python3用BeautifulSoup抓取图片地址
# -*- coding:utf-8 -*- #python 2.7 #XiaoDeng #http://tieba.baidu.com/p/2460150866 #抓取图片地址 from bs4 i ...
-
eslint 代码规范2
eslint 规则修改 需要修改规则:文件[.eslintrc.js] 在句末是不能有分号的,若想加分号, 报错: 添加代码: 'semi': ['error', 'always'] 不要使用制表符. ...
-
3D打印切片软件介绍
熟悉3D打印的流程的人都知道,在建立了3D模型以后要就进行切片,但是什么是切片呢?切片实际上就是讲3D模型转化为3D打印机本身可以执行的代码,G代码,M代码. 3D打印流程 今天我们简要的介绍3款切片 ...
-
034 Spark Sql的入门介绍
一:进程介绍 1.use sql 2.shark 3.spark sql 4.终止shark 5.进程线 二:spark sql细节介绍 1.hive 与sparkSql比较(以后具体学习) 2.使用 ...