MySQL的优化细节
数据库设计
目的
结合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的优化细节的更多相关文章
- mysql日常优化细节
		
# sql语句优化> 1)使用limit限制一次性查询出的数据量2)链接查询代替子查询3)尽量不要使用select * ,将需要查找的字段列出来4)如果数据量特别大的话尽量将一条复杂的sql拆分 ...
 - MySQL 性能优化细节
		
服务器层面优化(了解) 将数据保存在内存中,保证从内存读取数据 设置足够大的innodb_buffer_pool_size,将数据读取到内存中. 建议innodb_buffer_pool_size设置 ...
 - php代码优化,mysql语句优化,面试需要用到的
		
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...
 - 对于mysql数据库优化的见解
		
一.数据库占用的空间大小.表占用空间大小.索引占用空间大小 在用阿里云的数据库的时候经常出现磁盘空间爆满的情况.所以要经常查询数据库相关内容占用的磁盘大小,有很多mysql客户端如navicat 就可 ...
 - MySQL数据库优化小建议
		
背景 “那啥,你过来一下!” “怎么了?我代码都单元测试了的,没出问题啊!”我一脸懵逼跑到运维大佬旁边. “你看看!你看看!多少条报警,赶快优化一下!”运维大佬短信列表里面好多MySQL CPU 10 ...
 - Mysql服务优化
		
Mysql服务优化 Mysql服务加速优化的6个阶段 硬件层面优化 操作系统层面优化 Mysql数据库层面优化 网站集群架构层面优化 安全优化 流程.制度控制优化 1.硬件层面优化 CPU ...
 - [sql]大型网站MySQL深度优化揭秘
		
大型网站MySQL深度优化揭秘 第1章优化的思路和线路 1.1 网站优化的思路 2 1.2 MySQL优化,nginx这样的东西怎么优化? 第2章硬件层面优化 2.1 数据库物理机 2.1.1 ...
 - Mysql 语句优化技巧
		
前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...
 - MySQL数据库优化、设计与高级应用
		
MySQL数据库优化主要涉及两个方面,一方面是对SQL语句优化,另一方面是对数据库服务器和数据库配置的优化. 数据库优化 SQL语句优化 为了更好的看到SQL语句执行效率的差异,建议创建几个结构复杂的 ...
 - MySQL 执行优化查询
		
查询执行的基础 当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的.当向MySQL发送一个请求的时候,MySQL执行过程如图1-1所示: 图1-1 查询执 ...
 
随机推荐
- E20180228-hm-xa
			
bounds n. 界限; 界限; 出界; 在(某人允许进入的)界限以外; 出格的; 跳跃( bound的名词复数 ); (球等的) 反跳; indice n. 指数(指指标, 如健康指数的指数); ...
 - Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)
			
朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...
 - 【原创】《从0开始学Elasticsearch》—初识Elasticsearch
			
目录 1. Elasticsearch 是什么2. Elasticsearch 中基本概念3. Elasticsearch 安装4. 访问 Elasticsearch 1. Elasticsearch ...
 - html 解决空格显示问题
			
前端开发者都知道,在html中手动输入多个空格或者是回车,在页面解析的时候都被解析成一个空白显示,但有时候的需求要求显示多个空格,这个问题怎么解决呢?根绝我个人的经验,目前找到了以下集中解决办法: 1 ...
 - Python学习规划
			
短时间踏实而高效的学习python 知乎:如何系统的学习python 简书:最全的python学习手册 目录 Python编程语言 python视频教程 Python神经网络算法与深度学习视频教程人工 ...
 - 二分查找+数学 HDOJ 4342 History repeat itself
			
题目传送门 题意:计算从1开始到第n个非完全平方数的开方和 分析:设第n个非完全平方数的值为a,x * x < a < (x+1) * (x+1),而且易得(tmp = sqrt (a) ...
 - 贪心+枚举/哈希表 HDOJ Trouble
			
题目传送门 题意:5个集合,每个集合最多200个数字,问是否每个集合挑一个数加起来和为0. 分析:显然n^5的程序果断超时,甚至n^3logn的二分也过不了.想n^3的方法,既然判断有没有,那么可以将 ...
 - Windows环境下修改Oracle实例监听IP地址
			
Windows环境下修改Oracle实例监听IP地址. 配置文件路径:<ORACLE_HOME>\NETWORK\ADMIN 如:C:\Oracle11gR2\product\11.2.0 ...
 - 451 Sort Characters By Frequency 根据字符出现频率排序
			
给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...
 - javaScript关闭浏览器 (不弹出提示框)
			
一段JavaScript脚本程序,负责关闭窗口,如果网页不是通过脚本程序打开的(window.open()),调用window.close()脚本关闭窗口前,必须先将window.opener对象置为 ...