MySQL数据库开发的三十六条军规
一.核心军规
尽量不在数据库做运算,cpu计算的事务必移至业务层;
控制表、行、列数量(【控制单张表的数据量 1年/500W条,超出可做分表】,【单库表数据量不超过300张】 、【单张表的字段个数不超过50个,多了拆表】)
三大范式没有绝对的要使用,效率优先时可适当牺牲范式 https://www.cnblogs.com/wdw31210/p/8574853.html
拒绝3B(拒绝大sql语句:big sql、拒绝大事物:big transaction、拒绝大批量:big batch);
二.字段类军规
用好数值类型(用合适的字段类型节约空间); 如:一个字段注定就只有1跟2 要设计成 int(1) 而不是 int(11)
字符转化为数字(能转化的最好转化,同样节约空间、提高查询性能); 如,一个字段注定就只有1跟2,要设计成int(1) 而不是char(1) 查询优化如:字段类型是 char(1) 查询应当where xx='1' 而不是 xx=1 会导致效率慢
避免使用NULL字段(NULL字段很难查询优化、NULL字段的索引需要额外空间、NULL字段的复合索引无效); ,如: 要设计成 `c` int(10) NOT NULL DEFAULT 0 而不是 `c` int(10) NOT NULL;
少用text/blob类型(尽量使用varchar代替text字段); 需要请拆表
不在数据库存图片,请存图片路径,然后图片文件存在项目文件夹下。
三.索引类军规
合理使用索引(改善查询,减慢更新,索引一定不是越多越好); 如:不要给性别创建索引
字符字段必须建前缀索引; `pinyin` varchar(100) DEFAULT NULL COMMENT '小区拼音', KEY `idx_pinyin` (`pinyin`(8)),
不在索引做列运算;如: WHERE to_days(current_date) – to_days(date_col) <= 10 改为 WHERE date_col >= DATE_SUB('2011-10- 22',INTERVAL 10 DAY);
innodb主键推荐使用自增列(主键建立聚簇索引,主键不应该被修改,字符串不应该做主键)(理解Innodb的索引保存结构就知道了); 如:用独立亍业务的AUTO_INCREMENT
不用外键(由程序保证约束);
四.SQL类军规
sql语句尽可能简单(一条sql只能在一个cpu运算,大语句拆小语句,减少锁时间,一条大sql可以堵死整个库);
简单的事务;
避免使用trig/func(触发器、函数不用,由客户端程序取而代之);
不用select *(消耗cpu,io,内存,带宽,这种程序不具有扩展性); 如:select a ,b,c 会比 select * 好 只取需要列
OR改写为IN 如: where a=1 or a=2 改 a in(1,2)
OR改写为UNION 针对不同字段 where a=1 or b=1 改 select 1 from a where a=1 union select 1 from a where b=1
避免负向%; 如 where a like %北京% 改为 where a like '北京%'
limit高效分页(limit越大,效率越低); 如 Limit 10000,10 改为 where id >xxxx limit 11
使用union all替代union(union有去重开销);
高并发db少用2个表以上的join;
使用group by 去除排序加快效率; 如: group by name 默认是asc排序改 group by name order by null 提高查询效率
请使用同类型比较; 如: where 双精度=双精度 数字=数字 字符=字符 避免转换导致索引丢失
打散大批量更新; 如:在凌晨空闲时期更新执行
五.约定类军规
隔离线上线下 ,如:开发用dev库 测试用qa库 模拟用sim库 线上用线上库 ,开发无线上库操作权限
不在程序端加锁,即外部锁,外部锁不可控,会导致 高并发会炸,极难调试和排查
统一字符 UTF-8 校对规则 utf8_general_ci 出现乱码 SET NAMES UTF8
统一命名规范,库表名一律小写,索引前缀用idx_ 库名 用缩写(2-7字符),不使用系统关键字保留字命名
MySQL数据库开发的三十六条军规的更多相关文章
- Java开发学习(三十六)----SpringBoot三种配置文件解析
一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...
- BizTalk开发系列(三十六) Orchestration单实例执行
BizTalk 是高效的消息处理引擎,采用多线程并发的方式来处理消息.也就是说当有消息被接收的时候就会产生一个新的消息处理实例.但有时目标系统可能并没有并发处理 的能力, 这时就需要在BizTalk中 ...
- 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题
String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...
- Android UI开发第三十六篇——使用Volley加载图片列表
Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载,那么Volley是怎么加载图片列表的呢,这一篇 ...
- MySQL数据库开发规范-EC
最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...
- MySQL 数据库开发的 36 条军规
MySQL 数据库开发的 36 条军规 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算:cpu计算务必移至业务层 ...
- [Effective Java 读书笔记] 第三章类和接口 第十六条
第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...
- Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索
第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...
随机推荐
- WebApi中使用Ninject 依赖注入
之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...
- DSAPI 3张图片实现花开动画
效果图 素材 代码 Dim B0, B1, B3 As Bitmap Private B As Bitmap = Nothing Private Sub Loading_Load(sender As ...
- C# 曲线上的点(一) 获取指定横坐标对应的纵坐标值
获取直线上的点,很容易,那曲线呢?二阶贝塞尔.三阶贝塞尔.多段混合曲线,如何获取指定横坐标对应的纵坐标? 如下图形: 实现方案 曲线上的点集 Geometry提供了一个函数GetFlattenedPa ...
- ASP.net<a>标签跨页面传参数
//在goodsDetail.aspx页面接收 <script> //加载事件 $(function () { //第一种方式 var id=GetQueryString("id ...
- CSS文本属性 文本阴影text-shadow 换行 text-overflow
div{ font-size: 20px; text-shadow: 5px 5px 5px #333; text-shadow: 10px 10px ...
- 剑指前端(前端入门笔记系列)—— JS基本数据类型及其类型转换
基本数据类型 ECMAScript中有5中简单数据类型性(也称为基本数据类型):Undefined.Null.Boolean.Number和String,还有一种复杂数据类型——Object,Obje ...
- 【20190220】HTTP-知识点整理:TCP/IP与HTTP
TCP/IP是互联网相关的各类协议族的总称,HTTP属于它内部的一个子集. 一.TCP/TP的分层管理 1. 应用层 应用层决定了向用户提供应用服务时通信的活动.TCP/IP 协议族内预存了各类通用的 ...
- HTML之body标签中的相关标签补充
一 列表标签 列表标签分为三种. 1.无序列表<ul>,无序列表中的每一项是<li> 英文单词解释如下: a.ul:unordered list,“无序列表”的意思. b.li ...
- Ajax - Apache安装配置
apache安装配置 1.安装wamp2.配置根路径3.默认的网站根路径是安装目录的www子目录,如果不想使用默认目录,可以自己配置.配置方式如下: --找到文件wamp\bin\apache\Apa ...
- 自动化测试 Appium之Python运行环境搭建 Part1
Appium之Python运行环境搭建 Part1 by:授客 QQ:1033553122 实践环境 Win7 Python 3.4.0 JAVA JDK 1.8.0_121 node.js8.11. ...