MySQL数据库开发的三十六条军规

Wesley13
• 阅读 633

一.核心军规

尽量不在数据库做运算,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字符),不使用系统关键字保留字命名

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这