火狐体育官方版

加强技术投入,共享技术成果

火狐体育官方版:【干货】MySQL数据库开发规范


更新日期:2022-08-14 16:18:23 来源:火狐体育官网app下载ios 作者:火狐体育娱乐app下载

  所有的数据库对象名称必须使用小写字母并用下划线分割(MySQL大小写敏感,名称要见名知意,最好不超过32字符)

  所有的数据库对象名称禁止使用MySQL保留关键字(如 desc、range、match、delayed 等,请参考MySQL官方保留字)

  所有存储相同数据的列名和列类型必须一致。(在多个表中的字段如user_id,它们类型必须一致)

  mysql5.5之前默认的存储的引擎是myisam,没有特殊要求,所有的表必须使用innodb(innodb好处支持失误,行级锁,高并发下性能更好,对多核,大内存,ssd等硬件支持更好)

  数据库和表的字符集尽量统一使用utf8(字符集必须统一,避免由于字符集转换产生的乱码,汉字utf8下占3个字节)

  尽量控制单表数据量的大小在500w以内,超过500w可以使用历史数据归档,分库分表来实现(500万行并不是MySQL数据库的限制。过大对于修改表结构,备份,恢复都会有很大问题。MySQL没有对存储有限制,取决于存储设置和文件系统)

  谨慎使用mysql分区表(分区表在物理上表现为多个文件,在逻辑上表现为一个表)

  尽量做到冷热数据分离,减小表的宽度(mysql限制最多存储4096列,行数没有限制,但是每一行的字节总数不能超过65535。列限制好处:减少磁盘io,保证热数据的内存缓存命中率,避免读入无用的冷数据)

  禁止在表中建立预留字段(无法确认存储的数据类型,对预留字段类型进行修改,会对表进行锁定)

  限制每张表上的索引数量,建议单表索引不超过5个(索引会增加查询效率,但是会降低插入和更新的速度)

  避免建立冗余索引和重复索引(冗余:index(a,b,c) index(a,b) index(a))

  每个innodb表必须有一个主键,选择自增id(不能使用更新频繁的列作为主键,不适用UUID,MD5,HASH,字符串列作为主键)

  优先选择存储最小的数据类型(varchar(N),N代表的是字符数,而不是字节数,N代表能存储多少个汉字)

  避免使用ENUM数据类型(修改ENUM值需要使用ALTER语句,ENUM类型的ORDER BY操作效率低,需要额外操作,禁止使用书值作为ENUM的枚举值

  尽量把所有的字段定义为NOT NULL(索引NULL需要额外的空间来保存,所以需要暂用更多的内存,进行比较和计算要对NULL值做特别的处理)

  同财务相关的金额数据,采用decimal类型(不丢失精度,禁止使用 float 和 double)

  避免使用双%号和like,搜索严禁左模糊或者全模糊(如果需要请用搜索引擎来解决。索引文件具有 B-Tree 的最左前缀匹配特性,如果左边的值未确定,那么无法使用此索)

  禁止select * 查询(消耗更多的cpu和io及网络带宽资源,无法使用覆盖索引)

  禁止使用不含字段列表的insert语句(不允许insert into t values(‘a’,‘b’,‘c’)不允许)

  in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内

  禁止where从句中对列进行函数转换和计算(例如:where date(createtime)=‘20160901’ 会无法使用createtime列上索引。改成 where createtime

  =20160901 and createtime 20160902)

  拆分复杂的大SQL为多个小SQL( MySQL一个SQL只能使用一个CPU进行计算)

  尽量避免使用子查询,可以把子查询优化为join操作(子查询的结果集无法使用索引,子查询会产生临时表操作,如果子查询数据量大会影响效率,消耗过多的CPU及IO资源)

  超过100万行的批量写操作,要分批多次进行操作(大批量操作可能会造成严重的主从延迟,binlog日志为row格式会产生大量的日志,避免产生大事务操作)

  对于大表使用pt—online-schema-change修改表结构(避免大表修改产生的主从延迟,避免在对表字段进行修改时进行锁表)

  超过三个表禁止 join。(需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。即使双表 join 也要注意表索引、SQL 性能。)

  在varchar字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可。

  SQL 性能优化的目标:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts最好

  尽量不要使用物理删除(即直接删除,如果要删除的话提前做好备份),而是使用逻辑删除,使用字段delete_flag做逻辑删除,类型为tinyint,0表示未删除,1表示已删除

  如果有 order by 的场景,请注意利用索引的有序性。order by 最后的字段是组合,索引的一部分,并且放在索引组合顺序的最后,避免出现 file_sort 的情况,影响查询性能。

  在代码中写分页查询逻辑时,若 count 为 0 应直接返回,避免执行后面的分页语句

  多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!

  多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!

  B哥:直接分页查询,使用limit分页。 也许有些人没遇过上千万数据量的表,也不清楚查询上千万数据量的时候会发生什么。 代码创建一千万?那是不可能的,太慢了,可能真的要跑一天。可以采用数据库脚本执行速度快很多。 MySQL 支持 LIMIT 语句来选取指定的条数数据, Orac…

  故事从好多年前说起。 想必大家也听说过数据库单表**建议最大2kw**条数据这个说法。如果超过了,性能就会下降得比较厉害。 巧了。 我也听说过。

  01 前言 哈喽,好久没更新啦。因为最近在面试。用了两周时间准备,在 3 天之内拿了 5 个 offer,最后选择了广州某互联网行业独角兽 offer,昨天刚入职。这几天刚好整理下在面试中被问到有意思

  前言 我们都知道 InnoDB 在模糊查询数据时使用 %xx 会导致索引失效,但有时需求就是如此,类似这样的需求还有很多,例如,搜索引擎需要根基用户数据的关键字进行全文查找,电子商务网站需要根据用

  “不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用`*`作为查询的字段列表,本文从4个方面给出理由。

  相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构。 因为索引是MySQL中比较重点的知识,相信很多人都有一定的了解,尤其是在面试中出现的频率特别高。楼主自认为自己对MySQL的索引相关知识有很多了解,而且因为最近在找工作面试,所以…

  在Django中使用MySQL数据库,创建应用程序并编写类模型,用过setting配置并执行文件迁移使数据库自动生成表

  nodejs诞生以来出现了一大批的web框架如express koa2 egg等等,前端可以不再依赖后端可以自己控制服务端的逻辑。今天我们就来说说前端在nodejs中如何操作mysql数据库。 简单查询条件场景可以解决,但是我们的真实场景的查询条件中各种表关联、各种字段like…

  背景 刚入行的同学,看到在SQL语句中出现where 1 = 1这样的条件可能会有所困惑,而长时间这样使用的朋友可能又习以为常。 那么,你是否还记得当初为什么要这样写?是否有性能问题?有没有更好的写法

  redis、mysql双写缓存不一致: 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。目前没有一篇全面的博客,对这几种方案

  数据库最核心的一点就是用来存储数据,数据存储就避免不了和磁盘打交道。那么数据以哪种方式进行存储,如何存储是存储的关键所在。所以存储引擎就相当于是数据存储的发动机,来驱动数据在磁盘层面进行存储。 在创建新表的时候,可以通过增加 ENGINE 关键字设置新建表的存储引擎。 上图我们…

  SpringBoot 2.3.1.RELEASE版本,整合Mysql和Mybatis例子。 使用mybatis来操作数据库的时,我们还需要创建dto、dao、*Mapper.xml文件。如果手动创建上述文件的话,那将会非常的麻烦!!!好在人民的智慧是无穷的,我们可以通过myba…

  MySQL 三万字精华总结 + 面试100 问,和面试官扯皮绰绰有余(收藏系列)

  和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。 连接层:最上层是一些客户端和连…

  1. 写完SQL先explain查看执行计划(SQL性能优化) 日常开发写SQL的时候,尽量养成这个好习惯呀:写完SQL后,用explain分析一下,尤其注意走不走索引。 降低写错SQL的代价, 你在命令行执行这个SQL的时候,如果不加limit,执行的时候一个不小心手抖,可能…

  范式来自来自英文 Normal From 。开发过程中要设计一个好的数据库逻辑关系,必须满足一定的约束条件,此约束条件形成了开发范式,分成几个等级,一级比一级严格。

  小孩子从小就有一个疑惑:为什么我在接触一门新课程的时候总是觉得它很高大上,并且学的过程也比较痛苦,但是当我真正学会它的时候,又会觉得这玩意儿也就那样,没什么了不起的,但是为啥学的时候就不能很轻松呢?有时候我们走了很久,却忘记自己为什么出发,类似的,大人长大后就忘记了自己作为小孩…

  多表 多表简述 实际开发中,一个项目通常需要很多张表才能完成。 例如一个商城项目的数据库,需要有很多张表:用户表、分类表、商品表、订单表.... 单表的缺点 数据准备 1) 创建一个数据库db3 2)

  答案:依靠日志。 因为在执行一个操作之前,数据库会首先把这个操作的内容写入到文件系统日志里,然后再进行操作。当宕机或者断电的时候,即使操作并没有执行完,但是日志在操作前就已经写好了,我们仍然可以根据日志的内容来进行恢复。 MySQL InnoDB 引擎中和一致性相关的有重做日志…

  面试官:要不你来讲讲你们对MySQL是怎么调优的? 候选者:哇,这命题很大阿…我认为,对于开发者而言,对MySQL的调优重点一般是在「开发规范」、「数据库索引」又或者说解决线上慢查询上。 候选者:而对

  因为我最近的一些工作内容跟数据分析比较密切,所以需要对SQL使用得比较熟练,所以便阅读了《MySQL 必知必会》这本书,为了检验自己的阅读效果及帮助一些跟我一样需要学习MySQL相关的知识的朋友,所以每阅读一章,我就开始写一章的读书笔记,并在掘金的读书笔记版块发布沸点。一共三十…