数据库设计

目的

结合DBMS(数据库管理系统)实现有效存储、高效访问。减少数据冗余,避免维护异常,节约存储空间。

大概的步骤

需求分析->逻辑设计->物理设计(考虑数据库系统的差异)->维护优化(新需求建表,索引,拆分)。

需求分析

理清楚实体及实体之间的关系(一对一,一对多,多对多),实体包含的属性,哪些属性(或者属性组合)可以唯一标识一个实体

数据库设计的三大范式

第一范式

如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。第一范式要求数据库中的表都是二维表

就比如说,如果有一个表的列名是籍贯,里面存储的数据是广东广州等等,好了那么这里有一个问题,查询的时候,我要怎么查所有籍贯是广东省的?或许可以用模糊查询,但是这不是最好的解决办法,如果是只查广东广州呢?如果别的省份也有广州呢?

所以说最好的解决办法是把省份和城市分开。

第二范式

数据库的表中不存在非关键字段对任意候选关键字段的部分函数依赖。

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

所有单关键字段的表都符合第二范式

对于某些多对多关系的表,需要分开存储并且使用外键关联。

第三范式

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

第二范式的基础上解决了传递依赖

BC范式

在第三范式的基础之上,数据库表如果不存在任何字段对任意候选关键字段的传递函数依赖则符合BC范式。

确保数据表中的每一列数据都和主键和候选关键字直接相关,而不能间接相关

物理设计

MySQL存储引擎

主流的有MyISAM和InnoDB

MyISAM

不支持事务处理,并发插入的表级锁,一般不用于频繁读写。

Innodb

MVCC行级锁,适用于大部分情况。

表和字段命名规则

- 可读性原则
使用大小写,某些数据库系统对大小写敏感。

- 表意性原则
名称应该表示功能

- 长名原则
尽量使用全名

字段类型的选择原则

列的数据类型一方面影响了数据存储空间的开销,另一方面也会影响数据查询性能。当一个列可以选择多种数据类型的时候
- 首先考虑数字类型
- 其次考虑日期或者二进制类型
- 最后是字符类型
- 相同级别的数据应该优先选择占用空间小的,比如char varchar 之间应该选择varchar

原因:
- 数据进行比较(查询、JOIN、排序)时,相同数据,字符处理比数字慢
- 在数据库中,数据处理以页为单位,列的长度越小,利于性能提升。

char 和 varchar

1. 列中数据长度差不多的应该考虑char
2. 列中数据长度小于50 byte一般也用char。(列很少用除外,为了节省空间和减少IO,还是应该考虑varchar)
3. 一般不宜定义大于50 B的char

decimal和float

1. decimal(8个字节)存储精确数据
2. float开销小(4个字节)

时间类型

- int存储
字段长度比datetime小,但是使用不方便,要函数转换。只能存储到2038-1-19。
- 时间粒度
考虑时间粒度选择适合的类型值

主键选择

1. 业务主键和数据库主键
业务主键用于标识业务数据,进行表与表之间的关联。
数据库主键为了优化数据存储
Innodb会默认生成6字节的隐含主键,所以尽量自定义主键提高存储效率

2. 根据数据库类型,考虑逐渐是否要顺序增长
有些数据库是按主键顺序逻辑存储的

3. 主键字段类型占用空间要尽可能小。
对于使用聚集索引方式存储的表,每个索引猴都会附加主键信息

避免使用外键约束

- 降低数据导入效率
- 增加维护成本‘
- 虽然不使用约束,但是相关联的列上一定要建立索引

避免使用触发器

- 降低数据导入效率
- 可能出现意想不到的数据异常
- 使业务逻辑变得复杂

关于预留字段

- 无法准确知道预留字段的类型
- 无法准确知道所存储的内容
- 后期维护字段成本和增加字段成本相同

严禁使用预留字段

反范式化

通过数据冗余增加存取效率,简化查询语句。空间换取时间。
- 减少关联表数量
- 增加读取效率
- 要适度

维护及优化

- 可以增加表或者字段的备注
- 经常查询的列要加索引,索引不要包括太长的数据类型
- 过多的索引会降低读和写的效率,所以要定期维护索引碎片,SQL语句中不要使用强制索引关键字。
- 变更表结构控制表的宽度和大小,同时对数据字典进行维护
- 尽量不使用select *
- 控制用户使用自定义函数
- 不要使用全局索引

表拆分

垂直拆分

- 经常查询的列放到一起
- text, blob等大字段拆分到另一附加表中

水平拆分

- 通过主键哈希平均分成几分

MySQL的优化细节的更多相关文章

  1. mysql日常优化细节

    # sql语句优化> 1)使用limit限制一次性查询出的数据量2)链接查询代替子查询3)尽量不要使用select * ,将需要查找的字段列出来4)如果数据量特别大的话尽量将一条复杂的sql拆分 ...

  2. MySQL 性能优化细节

    服务器层面优化(了解) 将数据保存在内存中,保证从内存读取数据 设置足够大的innodb_buffer_pool_size,将数据读取到内存中. 建议innodb_buffer_pool_size设置 ...

  3. php代码优化,mysql语句优化,面试需要用到的

    首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...

  4. 对于mysql数据库优化的见解

    一.数据库占用的空间大小.表占用空间大小.索引占用空间大小 在用阿里云的数据库的时候经常出现磁盘空间爆满的情况.所以要经常查询数据库相关内容占用的磁盘大小,有很多mysql客户端如navicat 就可 ...

  5. MySQL数据库优化小建议

    背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边. “你看看!你看看!多少条报警,赶快优化一下!”运维大佬短信列表里面好多MySQL CPU 10 ...

  6. Mysql服务优化

    Mysql服务优化   Mysql服务加速优化的6个阶段 硬件层面优化 操作系统层面优化 Mysql数据库层面优化 网站集群架构层面优化 安全优化 流程.制度控制优化 1.硬件层面优化 CPU     ...

  7. [sql]大型网站MySQL深度优化揭秘

    大型网站MySQL深度优化揭秘 第1章优化的思路和线路 1.1 网站优化的思路    2 1.2 MySQL优化,nginx这样的东西怎么优化? 第2章硬件层面优化 2.1 数据库物理机 2.1.1 ...

  8. Mysql 语句优化技巧

    前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...

  9. MySQL数据库优化、设计与高级应用

    MySQL数据库优化主要涉及两个方面,一方面是对SQL语句优化,另一方面是对数据库服务器和数据库配置的优化. 数据库优化 SQL语句优化 为了更好的看到SQL语句执行效率的差异,建议创建几个结构复杂的 ...

  10. MySQL 执行优化查询

    查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...

随机推荐

  1. 洛谷 P1081 开车旅行【双向链表+倍增】

    倍增数组的20和N写反了反复WAWAWA-- 注意到a和b在每个点上出发都会到一个指定的点,所以这样构成了两棵以n点为根的树 假设我们建出了这两棵树,对于第一问就可以枚举起点然后倍增的找出ab路径长度 ...

  2. qr.update导致的java.lang.NullPointerException空指针异常

    debug以后代码走到了qr.update这一步,再向下走一步就会报错了,内容是java.lang.NullPointerException 最后再三检查发现是SQL语句写错了!,我写的是插入语句是I ...

  3. 动态规划基础复习 By cellur925

    结束帝都的qbxt dp图论精讲班后,感觉自己依然很水,接下来的一周,不妨来复习一下讲课内容:) 动态规划是lyd讲的,上次在泉城讲数据结构,然鹅体验较差,这次虽说好了些,但还是比想象中的效果不好(还 ...

  4. Ubuntu 18 开机后直接进入命令行界面,没法进入桌面

    应该是之前不知道干啥,删了gnome的一个东西,导致没法正常进入 暴力解决,直接重装桌面环境 sudo apt install ubuntu-desktop

  5. vscode等编辑器正则一键剔除注释的方法

    匹配HTML单行注释: <!--(.*?)--> 匹配HTML多行注释: <!--([\s\S|\r]*?)--> 或者: <!--([\w\W]*?)--> 除了 ...

  6. Oracle11.2.0.1升级到11.2.0.3

    Oracle数据库升级也并非简单的事,这篇博客,博主对Oracle那点事做了较详细的介绍: http://blog.itpub.net/9599/viewspace-473003/ 我还属于Oracl ...

  7. POJ 1686 Lazy Math Instructor(栈)

    原题目网址:http://poj.org/problem?id=1686 题目中文翻译: Description 数学教师懒得在考卷中给一个问题评分,因为这个问题中,学生会为所问的问题提出一个复杂的公 ...

  8. 2-SAT问题(白书)

    1. 定义 给定一个布尔方程,判断是否存在一组布尔变量的真值指派使整个方程为真的问题,被称为布尔方程的可满足性问题(SAT).SAT问题是NP完全的,但对于满足一定限制条件的SAT问题,还是能够有效求 ...

  9. 牛客小白月赛5-I-区间(差分求前缀和+一次暴力统计)

    题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作: 操作一:将a[L]-a[R]内的元素都加上P 操作二:将a[L]-a[R]内的元素都 ...

  10. 求N!尾数有多少个0。

    方法一:假设N!=K*10M,K不能被10整除,那么N!尾数就有M个0.再对N!进行质因子分解:N!=2x*3y*5z...由于10=2*5,即每一对2和5相乘都可以得到1个0,所以M只与指数x.z有 ...