当前位置:首页>编程日记>正文

mysql开发规范最新版本_MYSQL 开发规范

数据库命名规范

所有数据库对象表名必须小写 (mybook_db)

命名要做到见名知意,不能使用mysql保留关键字

临时表 tmp_ 开头,备份表以 bak_ 开头 都以时间戳结尾

所有存储相同数据的列名和列类型必须一致

mysql开发规范最新版本_MYSQL 开发规范 配图01

两个表的 列名和字段类型相同,这种列一般作为关联列来使用,如果字段类型不同,在进行关联查询时,会进行相应的转换,影响查询的效率。

数据库基本设计规范

所有表使用 innodb 存储引擎 (mysql5.5 以前使用 Myisam 引擎)

所有表和字段都要有备注信息 (在sql语句后面加上 comment),并使用UTF-8字符集

要尽量控制单表大小,并把冷热数据分离

禁止使用预留字段(预留字段无法见名知意,也无法确认存储的字段类型,修改预留字段会对表进行锁定,成本远高于增加字段)和在表中存储大的二进制数据

禁止在线上做数据库压力测试

禁止从开发环境,测试环境直连生成环境数据库

数据库索引设计规范

面试:

我们要在那些列上建立索引:

SELECT, UPDATE, DELETE 语句的WHERE 从句中的列

包含在 ORDER BY, GROUP BY, DISTINCT 中的字段

多表join 的关联列(不加索引性能较差)

如何选择索引列的顺序:

我们知道在联合索引中,索引列是按照从左到右来使用的,所以在建立索引时按照以下顺序建立

区分度最高的列(主键,唯一键)放在联合索引的最左侧

尽量把字段长度小的列放在联合索引的最左侧

如果上面两条都类似的情况下,将使用最频繁的列放在联合索引的左侧

覆盖索引:包含了所有查询字段(如select where从句中的列,orderby groupby中的列的索引)

索引规范:

限制每张表上的索引数量,建议单张表索引不超过5个(

innodb是按照主键索引来组织表的,所以每个表都要有主键(没有主键则按照非空唯一索引)

不使用频繁更新的列作为主键,不使用多列主键,不使用UUID,MD5,HASH,字符串列作为主键。建议使用自增ID值

避免建立冗余和重复索引(mysql和其他数据库不同, 主键就是一个非空唯一索引) primary key(id), index(id), unique index(id) # id上的主键 id上的索引 id上的唯一索引,这样就是建立了重复索引

index(a,b,c), index(a,b), index(a) # 对于a来说就是建立冗余索引,三个索引都是可以使用

尽量避免使用外键 (mysql会自动在外键上建立索引)。不建议使用外键约束,但一定在表与表之间的关联键上建立索引。外键保证数据的参照完整性,但建议在业务端实现

对频繁查询优先考虑使用覆盖索引, 避免Innodb表进行索引的二次查找,可以把随机IO变为顺序IO加快查询效率。

数据库字段设计规范

选择符合存储要求的最小的数据类型

避免使用Blob 或是 Text类型和ENUM 类型

每个字段尽可能的具有 NOT NULL属性

使用datetime 或 timestamp 类型存储时间

SQL 开发规范

使用预编译语句进行数据库操作 (一次编译,多次处理,提高效率。传递参数比传递sql语句更高效。防止sql 注入)

避免数据类型的隐式转换(隐式转换会导致索引失效) select name, phone from customer where id='123'

这里参数是字符串,而字段类型却是 int 类型,会导致隐式转换,从而使索引失效。

充分利用表上已经存在的索引(避免使用双%查询。 如 a like '%123%' 或者 a like '%123', 这两种情况都无法使用索引)。一个sql只能利用复合索引中的一列进行范围查询。使用 left join 和 not exists 来优化 not in 操作

禁止使用 select *,必须使用 select 查询 (消耗更多的io,cpu等资,无法使用覆盖索引,可减少表结构带来的影响)

禁止使用不包含字段的insert 语句,同select类似

禁止使用子查询,可以把子查询优化为 join(子查询结果集无法使用索引,产生临时表。消耗太多资源)

join 不要关联太多表(建议不超过5个,会产生临时表,影响查询效率)

减少同数据库的交互次数

禁止使用 order by rand() 进行随机排序(推荐在程序中获取随机值,然后从数据库中获取)

会把表中所有符合条件的数据加载到内存进行排序,消耗大量的cpu和io以及内存资源

where 从句禁止对列进行函数转换和计算(会导致无法使用索引) where date(createtime)='20170901' # 用下面的语句替换

where createtime >='20170901' and createtime

在明显不会有重复值时使用 UNION ALL 而不是 UNION(UNION ALL 不会对结果集进行去重。而UNION 会把所有数据放到临时中进行去重)

拆分复杂大sql 为多个小sql

数据库操作规范

超过100w的批量写操作,分批进行(大批量操作可能导致严重主从延迟,避免大事务操作)

对大表使用 pt-online-schema-change 修改表结构


http://www.coolblog.cn/news/dbb6f955ad9d730d.html

相关文章:

  • asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询
  • s7day2学习记录
  • 【求锤得锤的故事】Redis锁从面试连环炮聊到神仙打架。
  • 矿Spring入门Demo
  • 拼音怎么写_老师:不会写的字用圈代替,看到孩子试卷,网友:人才
  • Linux 实时流量监测(iptraf中文图解)
  • Win10 + Python + GPU版MXNet + VS2015 + RTools + R配置
  • 美颜
  • shell访问php文件夹,Shell获取某目录下所有文件夹的名称
  • 如何优雅的实现 Spring Boot 接口参数加密解密?
  • LeCun亲授的深度学习入门课:从飞行器的发明到卷积神经网络
  • Mac原生Terminal快速登录ssh
  • java受保护的数据与_Javascript类定义语法,私有成员、受保护成员、静态成员等介绍...
  • mysql commit 机制_1024MySQL事物提交机制
  • 支撑微博千亿调用的轻量级RPC框架:Motan
  • jquery 使用小技巧
  • 2019-9
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010
  • vscode pylint 错误_将实际未错误的py库添加到pylint白名单
  • 科学计算工具NumPy(3):ndarray的元素处理
  • 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  • linux批量创建用户和密码
  • newinsets用法java_Java XYPlot.setInsets方法代碼示例
  • js常用阻止冒泡事件
  • 气泡图在开源监控工具中的应用效果
  • 各类型土地利用图例_划重点!国土空间总体规划——土地利用
  • php 启动服务器监听
  • dubbo简单示例
  • 【设计模式】 模式PK:策略模式VS状态模式
  • [iptables]Redhat 7.2下使用iptables实现NAT
  • Ubuntu13.10:[3]如何开启SSH SERVER服务
  • CSS小技巧——CSS滚动条美化
  • JS实现-页面数据无限加载
  • 阿里巴巴分布式服务框架 Dubbo
  • 最新DOS大全
  • Django View(视图系统)
  • 阿里大鱼.net core 发送短信
  • 程序员入错行怎么办?
  • 两张超级大表join优化
  • 第九天函数
  • Linux软件安装-----apache安装
  • HDU 5988 最小费用流
  • Sorenson Capital:值得投资的 5 种 AI 技术
  • 《看透springmvc源码分析与实践》读书笔记一
  • 正式开课!如何学习相机模型与标定?(单目+双目+鱼眼+深度相机)
  • Arm芯片的新革命在缓缓上演
  • nagios自写插件—check_file
  • python3 错误 Max retries exceeded with url 解决方法
  • 行为模式之Template Method模式
  • 通过Spark进行ALS离线和Stream实时推荐