11 数据库优化

文章目录

    • 数据库优化
      • 数据库设计范式
      • MySQL存储引擎
      • 字段数据类型和键的选择
      • explain语句
      • SQL优化
      • 表的拆分

数据库优化

数据库设计范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。

各种范式呈递次规范,越高的范式数据库冗余越小。但是范式越高也意味着表的划分更细,一个数据库中需要的表也就越多,此时多个表联接在一起的花费是巨大的,尤其是当需要连接的两张或者多张表数据非常庞大的时候,表连接操作几乎是一个噩梦,这严重地降低了系统运行性能。所以通常数据库设计遵循第一第二第三范式,以避免数据操作异常,又不至于表关系过于复杂。

范式简介:

  • 第一范式: 数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等组合的数据项。简单来说要求数据库中的表示二维表,每个数据元素不可再分。

    例如: 在国内的话通常理解都是姓名是一个不可再拆分的单位,这时候就符合第一范式;但是在国外的话还要分为FIRST NAME和LAST NAME,这时候姓名这个字段就是还可以拆分为更小的单位的字段,就不符合第一范式了。

  • 第二范式: 第二范式(2NF)要求数据库表中的每个实例或记录必须可以被唯一地区分,所有属性依赖于主属性。即选取一个能区分每个实体的属性或属性组,作为实体的唯一标识,每个属性都能被主属性筛选。其实简单理解要设置一个区分各个记录的主键就好了。

  • 第三范式: 在第二范式的基础上属性不传递依赖,即每个属性不依赖其他非主属性。要求一个表中不包含已在其它表中包含的非主关键字信息。其实简单来说就是合理使用外键,使不同的表中不要有重复的字段就好了。

MySQL存储引擎

  • 定义: mysql数据库管理系统中用来处理表的处理器
  • 基本操作
1、查看所有存储引擎mysql> show engines;
2、查看已有表的存储引擎mysql> show create table 表名;
3、创建表指定create table 表名(...)engine=MyISAM;
4、已有表指定alter table 表名 engine=InnoDB;
  • 常用存储引擎特点

    InnoDB

    1. 支持行级锁,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进		行操作。
    2. 支持外键、事务、事务回滚
    3. 表字段和索引同存储在一个文件中1. 表名.frm :表结构2. 表名.ibd : 表记录及索引文件

    MyISAM

    1. 支持表级锁,在锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则		读也不允许
    2.  表字段和索引分开存储1. 表名.frm :表结构2. 表名.MYI : 索引文件(my index)3. 表名.MYD : 表记录(my data)
  • 如何选择存储引擎

    1. 执行查操作多的表用 MyISAM(使用InnoDB浪费资源)
    2. 执行写操作多的表用 InnoDBCREATE TABLE user(
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(30) DEFAULT NULL,
    sex varchar(2) DEFAULT NULL,
    PRIMARY KEY (id)
    )ENGINE=MyISAM;alter table hobby engine=myisam;
    

字段数据类型和键的选择

  • 数据类型优先程度 数字类型 --> 时间日期类型 --> 字符串类型
  • 同一级别 占用空间小的 --> 占用空间大的
字符串在查询比较排序时数据处理慢
占用空间少,数据库占磁盘页少,读写处理就更快
  • Innodb如果不设置主键也会自己设置隐含的主键,所以最好自己设置
  • 尽量设置占用空间小的字段为主键
  • 建立外键会自动建立索引,在表关联查询时建议使用外键子段作为关联条件
  • 外键虽然可以保持数据完整性,但是会降低数据导入和操作效率,增加维护成本

explain语句

使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。通过explain命令可以得到:

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询
explain select * from class where id <5;

EXPLAIN主要字段解析:

  • table:显示这一行的数据是关于哪张表的
  • type:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL,一般来说,得保证查询至少达到range级别,最好能达到ref。
type中包含的值:
- system、const: 可以将查询的变量转为常量. 如id=1; id为 主键或唯一键.
- eq_ref: 访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或唯一键)
- ref: 访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生 
- range: 这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西,并且该字段上建有索引时发生的情况
- index: 以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描 
- ALL: 全表扫描,应该尽量避免
  • possible_keys:显示可能应用在这张表中的索引。如果为空,表示没有可能应用的索引。
  • key:实际使用的索引。如果为NULL,则没有使用索引。
  • key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
  • rows:MySQL认为必须检索的用来返回请求数据的行数

SQL优化

  • 尽量选择数据类型占空间少,在where ,group by,order by中出现的频率高的字段建立索引

  • 尽量避免使用 select * …;用具体字段代替 * ,不要返回用不到的任何字段

  • 尽量控制使用自定义函数

  • 查询最后添加 LIMIT 会停止全表扫描

  • 尽量避免 NULL 值判断,否则会进行全表扫描,默认值为空时可以用默认0代替

    优化前:select number from t1 where number is null;

    优化后:select number from t1 where number=0;

  • 尽量避免 or 连接条件,否则会放弃索引进行全表扫描,可以用union代替

    优化前:select id from t1 where id=10 or id=20;

    优化后: select id from t1 where id=10 union all select id from t1 where id=20;

  • 尽量避免使用 in 和 not in,否则会全表扫描

    优化前:select id from t1 where id in (1,2,3,4);

    优化后:select id from t1 where id between 1 and 4;

表的拆分

垂直拆分 : 表中列太多,分为多个表,每个表是其中的几个列。将常查询的放到一起,blob或者text类型字段放到另一个表

水平拆分 : 减少每个表的数据量,通过关键字进行划分然后拆成多个表

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

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

相关文章

命令行hive的基本操作

使用SQL语句在命令行创建Hive库&#xff1a; CREATE DATABASE database_name;其中&#xff0c;database_name是要创建的数据库的名称。例如&#xff1a; CREATE DATABASE mydatabase;这将在Hive中创建一个名为"mydatabase"的数据库。 使用SQL语句在命令行创建Hive…

OS-Copilot:实现具有自我完善能力的通用计算机智能体

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ AI 缩小了人类间的知识和技术差距 论文标题&#xff1a;OS-Copilot: Towards Generalist Computer Agents with Self-Improvement 论文链接&#xff1a;https://arxiv.org/abs/2402.07456 项目主页&a…

【工具相关】zentao用例管理平台部署实践

文章目录 一、备份还原1、数据备份1.1、前言1.2、版本备份1.3、数据备份 2、数据恢复2.1、版本恢复2.2、数据恢复 二、问题处理1、ERROR: SQLSTATE[HY000] [2002] Connection refused 一、备份还原 1、数据备份 1.1、前言 禅道系统从10.6版本以后&#xff0c;新增数据备份设…

Go语言必知必会100问题-20 切片操作实战

前言 有很多gopher将切片的length和capacity混淆&#xff0c;没有彻底理清这两者的区别和联系。理清楚切片的长度和容量这两者的关系&#xff0c;有助于我们合理的对切片进行初始化、通过append追加元素以及进行复制等操作。如果没有深入理解它们&#xff0c;缺少高效操作切片…

云服务器python版本冲突解决(awd平台搭建)

文章目录 yum和apt-getdockerpython环境问题 大家在使用python时&#xff0c;难免会使用他人的代码&#xff0c;自己是python3&#xff0c;而别人的是python2.我们直接运行会报错(比如print函数括号的问题)。但是去修改代码又很麻烦。这里给大家推荐conda。我以我搭建awd平台为…

【Java.mysql】——增删查改(CRUD)之 增查(CR) 附加数据库基础知识

目录 &#x1f6a9;数据库操作 &#x1f388;创建数据库 &#x1f388;使用数据库 &#x1f388;删除数据库 &#x1f6a9;数据类型 &#x1f6a9;表的操作 &#x1f388;创建表 &#x1f308;查看表结构 &#x1f388;删除表 ❗练习(综合运用) &#x1f5a5;️新增…

微信小程序提示确认框

如图所示&#xff0c;如何弹出微信小程序自带默认弹框&#xff1f; 代码如下&#xff1a; wx.showModal({ title: 确认, content: 确定要删除吗&#xff1f;, success (res) { if (res.confirm) { console.log(用户点击确定) } else if (res.cancel) { console.log(用…

【基础算法】二分模板及常见题型

整数二分 模板 模板来自于AcWing&#xff1a; int[] nums new int[n];// 模板1: // l mid // mid l r 1 >> 1; int l 0, r n - 1; // [0, n - 1] while (l < r) {int mid l r 1 >> 1;if (check(mid)) l mid;else r mid - 1; }// 模板2: // r …

STM32CubeIDE基础学习-STM32CubeIDE软件程序仿真调试

STM32CubeIDE基础学习-STM32CubeIDE软件程序仿真调试 前言 一般编写完程序后都会进行编译&#xff0c;看结果是否有存在语法错误&#xff0c;确认没有语法错误之后再进行代码的下载观察硬件执行是否和软件编程预期的结果一致&#xff0c;如果发现硬件执行达不到预期现象&#…

JWT令牌技术

写在前面 我以为&#xff0c;最美的日子&#xff0c;当是晨起侍花&#xff0c;闲来煮茶&#xff0c;阳光下打盹&#xff0c;细雨中漫步&#xff0c;夜灯下读书&#xff0c;在这清浅时光里&#xff0c;一半烟火&#xff0c;一半诗意&#xff0c;任窗外花开花落&#xff0c;云来云…

JVM优化Java代码的秘密:深入解析JVM的内部工作机制

JVM优化Java代码的秘密&#xff1a;深入解析JVM的内部工作机制 当我们谈论Java性能优化时&#xff0c;JVM&#xff08;Java虚拟机&#xff09;的优化策略是无法回避的话题。JVM是Java应用的运行环境&#xff0c;它负责将Java字节码转换为可在特定操作系统和硬件上运行的机器码…

no main manifest attribute,in xxx.jar(关于Spring项目,无法在云服务器上运行jar包的解决方法)

目录 问题详情 解决方法 问题详情 项目可以打包正常&#xff0c;但是云服务器上无法运行&#xff0c;报错&#xff1a;no main manifest attribute&#xff0c;in xxx.jar 解决方法 1.查看pom.xml配置文件&#xff0c;检查以下代码&#xff0c;没有则加上&#xff1a; <…

B+树 和 跳表 的结构及区别,不同的用途【mysql的索引为什么使用B+树而不使用跳表?】

导语&#xff1a; 详解B树与跳表的结构及区别&#xff0c;描述B树与跳表新增数据的过程&#xff0c;解释MySQL与Redis选择对应结构的原因。 mysql数据表里直接遍历这一行行数据&#xff0c;性能就是O(n)&#xff0c;比较慢。为了加速查询&#xff0c;使用了B树来做索引&#x…

HTML5 Web Worker之性能优化

描述 由于 JavaScript 是单线程的&#xff0c;当执行比较耗时的任务时&#xff0c;就会阻塞主线程并导致页面无法响应&#xff0c;这就是 Web Workers 发挥作用的地方。它允许在一个单独的线程&#xff08;称为工作线程&#xff09;中执行耗时的任务。这使得 JavaScript 代码可…

第三周组会——动态多目标优化算法

首先对上周写的DF测试函数进行了优化和增加 DF4 pf: DF5测试函数PF DF6 遇到的问题,在算法问题的参数taut(变化频率)默认是10数字变小时就算是9,算法会跟不上收敛 新读的文献 A Novel Dynamic Multiobjective Optimization Algorithm With Hierarchical Response System 一…

linux系统docker的使用命令

docker命令 命令镜像操作镜像查找镜像拉取查看镜像制作过程推送镜像查看镜像修改名字查看镜像的详细信息删除镜像查看镜像所占空间 容器操作运行容器查看容器查看容器详细信息删除容器启动容器停止容器重启容器暂停容器激活容器杀死容器进入容器查看容器的日志复制文件重命名容…

1.2_3 TCP/IP参考模型

文章目录 1.2_3 TCP/IP参考模型&#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型&#xff08;二&#xff09;5层参考模型&#xff08;三&#xff09;5层参考模型的数据封装与解封装 1.2_3 TCP/IP参考模型 &#xff08;一&#xff09;OSI参考模型与TCP/IP参考模型 TCP/I…

【理解指针(1)】

理解指针&#xff08;1&#xff09; 1什么是内存2指针变量和地址21 取地址操作符&#xff08;&&#xff09;22 指针变量23 解引用操作符&#xff08;*&#xff09;24 指针变量的大小 3指针变量的意义31指针的解引用32 指针加减整数33 void* 指针 4. const 修饰指针41 const…

[嵌入式系统-38]:龙芯1B 开发学习套件 -8-启动过程详解

目录 一、启动程序的入口 二、初始化硬件浮点单元fpu 三、全局指针 四、设置系统栈 五、设置内存 六、设置Cache 七、配置协处理器 八、初始化TLB 一、启动程序的入口 FRAME(_start, sp, 0, ra)&#xff1a;这一行是一个汇编宏&#xff0c;用于创建一个函数框架。_star…

递归搜索回溯相关的题目解析和练习2

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;下面的题目用的方法和前面几篇的方法是一样的&#xff0c;写起来是比较困难的&#xff0c;加油 字母大小写全排列 https://leetcode.cn/problems/letter-case-permutation/ 解析 代码 class Solution {vector<string&g…