Mysql的设计规范和结构优化(-)

2024-05-29 08:18

本文主要是介绍Mysql的设计规范和结构优化(-),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.数据库设计规范

1.1 数据库命名规范

1.所有数据库对象名称必须使用小写字母并用下划线进行分割。

2.所有数据库对象名称禁止使用mysql保留的关键字。如from ,name,真需要使用时,给加反向单引号

3.数据库对象的命名要能做到见名知义,并且最好不要超过32个字符。数据库:Mc_Userdb,数据表:user_account

   4.临时表要以tmp_开头,备份表要以bak_开头并以时间戳结尾

1.2 数据库基本设计规范

1.没有特殊要求情况下,所有表必须使用innodb存储引擎。mysql5.5之前默认的存储引擎为myisam。Mysql5.5之后为innodb。Innodb能够很好的支持约束,事务、行级锁等特性,对数据的安全性和和一致性有很好的支持。

2.数据库和表的字符集统一使用utf-8。

3.所有表和字段都需要添加注释。

4.尽量控制单表数据量的大小,建议控制在500万以内。可以采用历史数据归档,分库分表等手段来控制数据。分区表:物理上存储在多个文件中,逻辑上是一个表。

5.尽量做到冷热数据的分离,减小表的宽度。减少磁盘io,保证热数据的内存缓存命中率。

6.禁止使用预留字段以及在表中存储大的二进制数据

问题:冷热数据的分离,减小表的宽度的作用?

答: 减小磁盘的io,保证热数据的内存缓存命中率。

     把经常使用的列放到一张表中。

     有效利用缓存,避免读入无用的冷数据。

1.3 数据库索引的设计规范

1.禁止给表中每一列都建立单独的索引,索引并不是越多越好。

2.避免冗余索引和重复索引

 如冗余索引:primaryindex(id),index(id),unique index(id)

重复索引:index(a,b,c),index(a),index(a,b)

Innodb的数据库是按照那个索引的顺序来组织表呢?

答案是:

主键。每个innodb的表必须有一个主键。

每个innodb表必须有一个主键,不使用更新频繁的列作为主键,不使用多列主键。

不使用uuid,md5,hash,字符串列作为主题。

主键建议选择使用自增id值。

  1. 在那些列上建立索引?不是唯一的方法

1.在where从句使用的字段包

2.含在order by ,group by ,distinct的字段上建立索引

3.多表关联的关联列上

3.如何选择索引列的顺序

分度最高的列放在联合索引的最左侧

量把字段长度小的列放在联合索引的最左侧

使用最频繁的列放到联合索引的最左侧。

1.4 数据字段设计规范

  1. 选择符合需要的最小的数据类型。定长用char,变长用varchar,大文本用text,blob数据类型。Varchar(N):N 代表的是字符数,而不是字节数。使用UTF-8存储汉字varchar(255)时候,1个字符=3个字节,则varchar(255)=765个字节。多余的内存造成内存消耗。
  2. 避免使用text、blob数据类型。如果使用建议将blob或text列分离到一个单独的表。
  3. 避免使用enum(枚举)数据类型。修改enum数据类型需要使用alter语句。
  4. 尽可能把所有列定义为not null。索引null列需要额外的空间来保存,所以要占用更多的空间。进行比较和计算时要对null值做特别的处理。
  5. 使用datetime或者timestamp类型存储时间。使用字符串存储日期,无法进行函数计算,占用更多的空间,yyyy-MM-dd HH:mm:ss 格式的日期,字符串需要16个字节,日期类型需要8个字节。
  6. 与金额相关的数据,必须使用decimal类型。decimal为精准浮点数,精度不会丢失
  7. 对于非负数据采用无符号整型进行存储。(因为存储的将是42个亿,比有符号,多一倍)

1.5 sql设计规范

1.建议使用预编译语句进行数据库的操作。只传参数,比传递sql语句更高效。

2.避免数据类型的隐式转换。Select  name,phone from student where id=’111’ (如id为int,而赋值给字符串,这样会隐式转换int型),否则索引失效。

3.使用left  join 或not exists 来优化not in操作

4.避免使用select * from xxx。

5.避免使用子查询,可以把子查询优化为join操作。

因为子查询的结果会缓存成一个个临时表,临时表中无法使用索引,数据量过大时,消耗过多的cpu和io资源。

6.避免使用join关联太多的表,建议3-5个,mysql最多支持61个表。

7.使用in代替or。In的值不要超过500个,in操作相对于or操作可以有效的利用索引。

8.禁止使用order by rand()进行随机排序。

9.where从句中禁止对列进行函数转换和计算(因为导致无法使用索引)。如where date(createtime)=’20160901’(datetime无法使用索引) 要改为where createtime>=2016-09-01 and createtime<2016-09-02  这样写的话可以使用到索引。

10.un.ion all 合并的结果;union 对合并的结果具有去重的功能。

11.拆分复杂的大sql为多个小sql。Sql拆分后可以通过并行执行来提高处理效率。

1.6 操作行为规范

1.超100万行的批量写操作,要分批多次进行操作。如大批量可能会造成严重的主从延迟。

Binlog日志为row格式时会产生大量的日志。避免产生大事务。

2.对于大表使用pt-online-schema-change修改表结构。避免锁表、主从延迟等问题。

3.对于程序连接数据库账号,遵循权限最小的原则,账号只能在一个DB下使用,不准跨越库。程序使用的账号不准有drop权限。

4.禁止为程序使用的账号赋予super权限,当大道最大连接数限制时,还运行1个有super权限的用户连接。

Super权限只能留给DBA处理问题的账号使用

这篇关于Mysql的设计规范和结构优化(-)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1013128

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份