互联网寒冬!技术站最全MySQL数据库实战规范

享学课堂特邀作者:老顾

转载请声明出处!

前言

我们小伙伴们经常使用到mysql数据库,一般就这么一用,很少会考虑mysql里面的细节问题,如sql语句的规范,或索引有没有起到相应的效果,今天老顾就给大家介绍一下mysql实战。

命名规范

1、所有数据库对象都要小写字母、并用下划线分割
2、所有数据库对象*不要用mysql关键字命名
3、库表的命名要达到看到此名称,就大概知道是干嘛的
4、临时库表要以tmp_为前缀,日期为后缀
5、备份库表要以bak_为前缀,日期为后缀
6、相同的数据,在所有表中的列名和类型要一致

基础设计规范

1、在新建表时,要使用InnoDB引擎

因为InnoDB支持事务、行锁、性能更好。

2、新库使用utf8mb4字符集

兼容更好,可以避免产生乱码,防止索引创建失败。

3、表和字段必须加入中文注释

方便以后的系统维护。

4、禁止使用存储过程、视图、触发器、Event

能够不占用数据库的资源,就不要占用;让这些计算上移到服务层。将来的进行数据拆分方便,存储过程等是针对单实例的,无法适用分库分表的架构。

5、单表数据量,控制在500万以内

当然mysql可以存储1000万数据,但过大后会影响mysql 的性能以及维护工作。想要存储更多的数据,可以对数据进行拆分,分库分表设计来控制单表数据量。

6、谨慎利用Mysql分区功能

在分区表中物理上面是多个文件,但逻辑上是一个文件,灵活度不够,而且跨分区查询效率低;还是建议使用物理分区,市面上也有一些中间件mycat、sharding-jdbc等。

7、减少表的宽度、冷热数据分离、必须有主键

a、mysql表的列数限制可以为4096列,每一行的数据大小不能超过65535字节;宽度越大,加载在内存中占用内存就越大,IO消耗越大。表的宽度建议在30左右。

b、要把经常用的数据列放在一起,这样可以一次性读取出来;把经常用不到的数据分离出去,这样极大提高效率 。

c、主键的好处,就是更好的利用索引,提高查询效率。不明白原理,可以看老顾之前的文章。

8、禁止使用外键,交给程序控制

这个是不是和我们理解的不一样,为什么不要外键?外键会导致表与表之间耦合,这样更新操作都会涉及到相关联的表,十分影响sql的性能,且容易造成死锁。

9、禁止使用预留字段

很多小伙伴为了以后的业务扩展,都喜欢在表中建立类似DEMO1、DEMO2字段,列名没有任何业务含义,而且类型都是用String代替。预留字段另一个好处就是业务改变后,利用预留字段,SQL语句不需要改变,其实这个问题用一些ORM工具就能够很好的解决。

字段设计规范

1、优先选择符合业务的最小存储类型

可以有效节省数据库的空间,查询的时候也能够减少IO消耗。

2、字段定义为Not Null,且提供默认值

null值的列,很难对索引优化;null的列对占用更多的空间,因为需要额外的空间来标识。null的查询操作,也过于麻烦,只能采用is null或is not null,而不能采用=、in、<、<>、not in 、!=操作符,如:where name!=‘laogu’,是不会查询出name为null的值的。

3、禁止使用Text、BLOB类型

Mysql内存临时表不支持Text、Blob类型,如果查询中包含这些类型,就不能使用内存临时表,而会采用磁盘临时表,导致性能很差会浪费更多的磁盘和内存空间,导致数据库内存命中率低,影响数据库性能
如果一定要使用,建立单独的扩展表。

4、禁止使用ENUM、可用Tinyint代替

修改Enum值时,需要使用alter语句 order by操作效率低。

5、禁止使用小数

直接使用整数,小数容易有精度差异,导致金额对不上。

6、使用Timestamp或Datetime类型存储时间

经常小伙伴们用String类型储存时间缺点

1:无法用日期函数进行计算比较缺点

2:用户字符串存储,占用更多的空间。

索引设计规范

1、每张表索引不要超过5个一般常识索引可以增加查询效率,但同样降低了插入和更新的效率。

但针对查询,索引也不是越多越好。因为mysql优化器在选择如何优化查询时,会根据查询信息,对每一个用到的索引进行评估,以生成一个最好的执行计划,如果有很多个索引,就会增加mysql优化器的执行时间,反而降低了查询性能。

2、区分度不高、更新频繁的列 不建议加索引

更新频繁会变更B+树,大大降低数据库的性能。区分度(区分度=列中不同值的数量/列的总行数),区分度不高(如:性别,只有男、女、未知)建立索引没有意义,性能和全表扫描差不多。

3、联合索引时,把区分度高的放到最左侧因为mysql的索引结构原理,联合索引有一个原则,就是最左索引原则。

a、尽量把区分度高的放在联合索引的最左侧

b、把查询频繁的列放在最左侧

c、把字段长度小的放到最左侧,这样内存页存储数据量越大,IO性能越好。

SQL开发规范

1、禁止使用select 要用select 列名 代替 select

原因:1、消耗更多的CPU、IO开销

2、无法使用覆盖索引

3、可减少表结构的改动,带来的代码影响。

2、禁止使用属性隐式转换

隐式转换会导致索引失效,如:select name from customer where id=‘1000’;id为整型,正确的写法select name from customer where id=1000。

3、建议使用预编译语句进行数据库操作

预编译语句可以重复使用优化计划,减少SQL编译时间,避免SQL注入。

4、禁止使用不含字段的insert语句

如:insert into txxxx values(xxx,xxx,xxx) 应使用insert into txxx(c1,c2,c3) values(xxx,xxx,xxxx)防止表结构变化。

5、禁止负向查询,以及%开头的模糊查询

负向查询为:not、!=、<>、not in、not like等,会导致全表扫描 %开头也会导致全表扫描。

6、一个SQL只能利用复合索引中的一列进行范围查询

如:有c1、c2、c3三个列建立联合索引,在查询条件中有c1列的范围查询,则在c2、c3列上的索引将不会被用到。如果一定要用c1做范围查询,那把c1列放到联合索引的最右侧。

7、禁止在where条件上对属性使用函数或表达式

如:select id from torder where fromunixtime(createtime) >= ‘20190101’
应改为
select id from torder where createtime >= unixtimestamp(‘20190720’)

8、禁止大表使用join查询,禁止大表使用子查询

会产生临时表,消耗较多的内存、cpu资源,影响性能。

9、避免使用JOIN关联太多的表

对于Mysql来说,是有关联缓存的,缓存的大小是由joinbuffersize参数进行设置。对于同一个SQL多关联一个表,就会多分配一个关联缓存,越多的join,就消耗越多的内存。如果joinbuffersize设置不合理,就会导致数据库内存溢出,影响性能和稳定性。

10、禁止使用OR条件,必须改为IN查询

绝大多数情况下,Mysql的OR查询是不能命中索引的。

11、尽量减少与数据库的交互次数

能够一次性读取尽可能多的数据,减少和数据库的交互,可以极大提升数据库的吞吐量。

12、禁止使用order by rand()进行排序

会把表中的所有数据都加到内存中,然后在对内存的数据进行随机排序,会消耗较多的CPU、IO以及内存资源
推荐在程序中生成一个随机值,传给数据库的方式。

总结

上面有很多规范,也许小伙伴一时间记不住,慢慢练习就会越熟练。老顾这里给大家分享一个索引口诀,方便记忆。

索引优化口诀
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!

以上MySQL数据库实战规范你都了解了吗?记住了吗?记不住还不快点个收藏点个赞→_←

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

资料免费领取方式:点击这里

你都了解了吗?记住了吗?记不住还不快点个收藏点个赞→_←

最后

如果觉得本文对你有帮助的话,不妨给我点个赞,关注一下吧!

资料免费领取方式:点击这里

[外链图片转存中…(img-pL6g0uFV-1623730871297)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL求一个表中非重复数据及其出现的次数

mysql中&#xff0c;我们可以用distinct求不重复的数据有多少&#xff0c;也可以用group by。 这里有个例子&#xff0c;如下表sheet1&#xff0c;共有5411条数据 查询语句 共有3446条不重复数据&#xff0c;每条不重复数据出现的次数在第二列显示&#xff1a;

什么是微服务扩展性和高可用-可扩展性、高可用性和性能

欢迎关注专栏&#xff1a;Java架构技术进阶。里面有大量batj面试题集锦&#xff0c;还有各种技术分享&#xff0c;如有好文章也欢迎投稿哦。 Overview 可扩展性、高可用性和性能 术语可扩展性、高可用性、性能和关键任务对于不同的组织或组织内的不同部门来说可能意味着不同的…

SQL实现当前行等于前面两行数据之和

sql实现类似斐波那契数列的功能&#xff0c;即当前数据等于前面两个数据之和&#xff0c;详看本文例子 原表&#xff1a; sql语句&#xff08;此处要熟悉JION ON的用法&#xff09; 结果

【大牛系列教学】靠着这份面试题跟答案

开篇闲扯 打工人&#xff0c;打工魂&#xff0c;我们生而人上人。当“资本主义”逐渐禁锢我们人&#xff08;大&#xff09;上&#xff08;韭&#xff09;人&#xff08;菜&#xff09;肉体的时候&#xff0c;那一刻我才明白那个日不落帝国资本主义收割机瑞民族之光幸瑞幸咖啡…

【工作感悟】成功入职阿里月薪45K

前言 苦苦寻觅找工作之间&#xff0c;殊不知今日之时乃我心之痛&#xff0c;难道是我不配拥有工作嘛。自面试后他所谓的等待都过去一段时日&#xff0c;可惜在下京东上的小金库都要见低啦。每每想到不由心中一紧。正处为难之间&#xff0c;手机忽然来了个短信预约后续面试。 我…

【工作经验分享】不会真有人觉得mybatis很难学吧

什么是自旋锁和互斥锁&#xff1f; 由于CLH锁是一种自旋锁&#xff0c;那么我们先来看看自旋锁是什么&#xff1f; 自旋锁说白了也是一种互斥锁&#xff0c;只不过没有抢到锁的线程会一直自旋等待锁的释放&#xff0c;处于busy-waiting的状态&#xff0c;此时等待锁的线程不会…

【工作经验分享】这些新技术你们都知道吗

前言 近年来&#xff0c;微服务架构(Microservices Architecture)已经成为一种主流的软件开发方法论&#xff0c;所谓微服务( Microservices ),就是一些具有足够小的粒度、能够相互协作且自治的服务体系。 微服务架构基于分布式系统&#xff0c;同时借助了面向服务架构和企业服…

【微信小程序】使用Hystrix的插件机制

前言 在本篇文章开始前&#xff0c;我想想来回答一个问题&#xff1a;我为什么要写这一篇关于面试的文章&#xff1f; 原因有三&#xff1a;第一&#xff0c;我想为每一个为梦想时刻准备着的”有心人“尽一份自己的力量&#xff0c;提供一份高度精华的Java面试清单&#xff1…

【微信小程序】目前最全的《Java面试题及解析》

开头 在找工作的过程中&#xff0c;对于 Redis 技术知识的掌握已经成为必须的技能。美团面试常常就会被问到Redis相关知识&#xff0c;而这次我就差点倒在了美团3面&#xff0c;面试官连问我以下几个Redis的问题&#xff0c;然后就卡壳了… redis了解吗&#xff1f;你说说怎么…

大话数据结构——算法

算法&#xff1a;算法是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 为什么把数据结构和算法一起说&#xff1f; 想想罗密欧与朱丽叶&#xff0c;梁山伯和祝英台&#xff0c;少了一个你总会觉得奇怪…

java线上培训班学费一般多少,成长路线图

前言 众所皆知的&#xff0c;Linux的核心原型是1991年由托瓦兹(Linus Torvalds)写出来的&#xff0c;但是托瓦兹为何可以写出Linux这个操作系统?为什么它要选择386的计算机来开发?为什么Linux的发展可以这么迅速?又为什么Linux是免费的?以及目前为何有这么多的 Linux版本(…

java线程池使用实战,太牛了!

前言 今天这篇文章中简单介绍一下一个 Java 程序员必知的 Linux 的一些概念以及常见命令。 如果文章有任何需要改善和完善的地方&#xff0c;欢迎在评论区指出&#xff0c;共同进步&#xff01;笔芯&#xff01; 正式开始 Linux 之前&#xff0c;简单花一点点篇幅科普一下操作…

大数据基础技术和应用

大数据概述 数据的表现形式&#xff1a; 线下数据信息化&#xff1a;数据库、文字记录、照片……互联网-移动互联网&#xff1a;网页数据、用户行为记录、数字图像……传感器&#xff1a;设备监控、智能家居、摄像头…… 大数据的4V特征&#xff1a; 大量化&#xff08;Vol…

java线程池参数面试题,附赠复习资料

前言 作为同时具备高性能、高可靠和高可扩展性的典型键值数据库&#xff0c;Redis不仅功能强大&#xff0c;而且稳定&#xff0c;理所当然地成为了大型互联网公司的首选。 众多大厂在招聘的时候&#xff0c;不仅会要求面试者能简单地使用Redis&#xff0c;还要能深入地理解底…

java线程池有几种,讲的太透彻了

前言 该文档在Github上收获40Kstar的Java面试神技&#xff08;这赞数&#xff0c;质量多高就不用我多说了吧&#xff09;非常全面&#xff0c;包涵Java基础、Java集合、JavaWeb、Java异常、OOP、IO与NIO、反射、注解、多线程、JVM、MySQL、MongoDB、Spring全家桶、计算机网络、…

HIVE入门

Hive概述 什么是 Hive&#xff1f; * Hive 是建立在 Hadoop HDFS 上的数据库仓库基础建构 * Hive 可以用来进行数据库提取转化加载&#xff08;ETL&#xff09; * Hive 定义了简单的类似 SQL 查询语言&#xff0c;称为 HQL&#xff0c;它允许熟悉 SQL 的用户查询数据 * Hi…

java线程面试题博客园,超详细

简介 HikariCP 是用于创建和管理连接&#xff0c;利用“池”的方式复用连接减少资源开销&#xff0c;和其他数据源一样&#xff0c;也具有连接数控制、连接可靠性测试、连接泄露控制、缓存语句等功能&#xff0c;另外&#xff0c;和 druid 一样&#xff0c;HikariCP 也支持监控…

java编写斐波那契数列,实战案例

前言 提到插件&#xff0c;相信大家都知道&#xff0c;插件的存在主要是用来改变或者增强原有的功能&#xff0c;MyBatis中也一样。然而如果我们对MyBatis的工作原理不是很清楚的话&#xff0c;最好不要轻易使用插件&#xff0c;否则的话如果因为使用插件导致了底层工作逻辑被…

java编程代写有哪些平台,学习路线+知识点梳理

前言 今天刚好有空&#xff0c;跟大家聊聊如何学好算法进大厂。 前两天一个读者和我说&#xff0c;他坚持刷算法题2个月&#xff0c;薪资翻番去了他梦寐以求的大厂&#xff0c;期间面字节跳动还遇到了原题…其实据我所知目前国内的大厂和一些独角兽&#xff0c;已经越来越效仿…

【工作感悟】java编程规范pdf下载

前言 要相信&#xff0c;你现在所有的努力和付出都会在将来的某一天回报给你&#xff01; 首先阿里巴巴作为国内互联网行业的领头羊&#xff0c;培养了一代又一代的IT技术人才&#xff0c;很多想进阿里这些互联网大厂的程序员看中的不仅仅是高薪丰厚的福利待遇&#xff0c;同样…