一.核心军规

尽量不在数据库做运算,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数据库开发的三十六条军规的更多相关文章

  1. Java开发学习(三十六)----SpringBoot三种配置文件解析

    一. 配置文件格式 我们现在启动服务器默认的端口号是 8080,访问路径可以书写为 http://localhost:8080/books/1 在线上环境我们还是希望将端口号改为 80,这样在访问的时 ...

  2. BizTalk开发系列(三十六) Orchestration单实例执行

    BizTalk 是高效的消息处理引擎,采用多线程并发的方式来处理消息.也就是说当有消息被接收的时候就会产生一个新的消息处理实例.但有时目标系统可能并没有并发处理 的能力, 这时就需要在BizTalk中 ...

  3. 网站开发进阶(三十六)String.getBytes()方法中的中文编码问题

    String.getBytes()方法中的中文编码问题 String的getBytes()方法是得到一个系统默认的编码格式的字节数组. getBytes("utf-8")得到一个U ...

  4. Android UI开发第三十六篇——使用Volley加载图片列表

    Android开发者可能会使用Universal Image Loader或者Square`s newer Picasso这些第三方的库去处理图片的加载,那么Volley是怎么加载图片列表的呢,这一篇 ...

  5. MySQL数据库开发规范-EC

    最近一段时间一边在线上抓取SQL来优化,一边在整理这个开发规范,尽量减少新的问题SQL进入生产库.今天也是对公司的开发做了一次培训,PPT就不放上来了,里面有十来个生产SQL的案例.因为规范大部分还是 ...

  6. MySQL 数据库开发的 36 条军规

    MySQL 数据库开发的 36 条军规 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算:cpu计算务必移至业务层 ...

  7. [Effective Java 读书笔记] 第三章类和接口 第十六条

    第十六条 复合优先于继承 如果不确定B和A的关系是,is-a的关系,B确实也是A,那么久不应该使用B继承A,否则会暴露实现细节, 你的实现都会限制在原始的实现上. 书中举的第一个例子,实现了一个类ex ...

  8. Gradle 1.12用户指南翻译——第三十六章. Sonar Runner 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  9. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

随机推荐

  1. DSAPI 远程协助之获取当前鼠标指针坐标及样式

    在编写远程协助类软件时,除了获取屏幕画面外,还需要获取鼠标当前的坐标以及当前的指针样式,以便让远程屏幕知道当前的操作状态. 使用DSAPI内置的鼠标指针类,可轻松获取. 代码如下: Imports D ...

  2. Redis分布式队列和缓存更新

    原文链接:https://www.cnblogs.com/hua66/p/9600085.html 在使用Redis中,我们可能会遇到以下场景: 例如: 某用户向服务器中发送一个请求,服务器将用户请求 ...

  3. Java 在PDF中添加水印——文本/图片水印

    水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下Java示例,将分别使用insertTextWatermark(PdfPageBas ...

  4. eclipse建立工作集管理项目

    废话不多说,直接上图 然后新建java working set管理项目,让自己的项目清晰明了

  5. openlayers二:添加矢量图形文字

    openlayers可方便的在地图上添加圆.多边形.文字等矢量内容,修改这些矢量内容的样式也很简单. 首先需要添加一个向量图层: initVectorLayer: function () { this ...

  6. 小米平板6.0以上系统如何不用Root激活Xposed框架的步骤

    在异常多公司的引流,或业务操作中,大多数需要使用安卓的神一般的Xposed框架,几天前我们公司买来了一批新的小米平板6.0以上系统,大多数都是基于7.0以上版本,大多数不能够获取Root超级权限,虽然 ...

  7. 自学MongoDB(1)

    MongoDB是nosql(非关系型数据库)中的一种,面向文档的数据库,介于传统的结构化数据库(关系型数据库)与非关系型数据库(文件储存)之间的一种,具有数据结构非常松散和非常灵活的特点;常用于存储分 ...

  8. qt5.11.2+vs2017环境下opencv3.4.1编译配置

    OpenCV是一个开源的计算机库,它可以帮助视觉工作者做很多富有创造性的工作,在图像处理领域扮演着重要的角色.由于opencv3.x的存在,不管你是学生还是研究人员,是专家还是初学者,都可以快速的建立 ...

  9. Win 10 和 Ubuntu 16.04 双系统,安装完成后,设置默认的启动项

    当安装好了 Windows 和 Ubuntu 双系统之后,默认的启动项是 Ubuntu,我们可以来设置默认的启动项, 开机时,在启动项选择处,可以通过↑↓ 键来选择启动哪个系统,第一行序号是 0 ,第 ...

  10. Java基础系列--01_基础类型

    J2SE.J2ME.J2EE分别指什么? J2SE 基础版,桌面应用. J2ME 微型版,手机开发.(android,ios) J2EE 企业版,所有浏览器访问的应用程序. 注意:JDK5以后改名 J ...