SQL笔记 -- 数据库结构优化

1. 拆分表(冷热数据分离)

不常用的数据为冷数据,反之则为热数据。如果一个表中的数据存在明显的使用频率差异,那么可以将冷热数据分离。通过这种分解可以提高表的查询效率。对于字段很多且有些字段使用不频繁的表,可以通过这种分解的方式来优化数据库的性能。

例如: 会员members表存储会员登录认证信息,该表中有很多字段,如id、姓名、密码、地址、电 话、个人描述字段。其中地址、电话、个人描述等字段并不常用,可以将这些不常用的字段分解出另一 个表。

2. 增加中间表

假如当前有两个表,学生信息表包含id、学号、姓名、年龄和班号,班级表包含id、班级名、地址、班长。

若现在有一个模块需要经常查询带有学生名称(name)、学生所在班级名称(className)、学生班级班 长(monitor)的学生信息。根据这种情况可以创建一个 temp_student 表。temp_student表中存储学生名称(stu_name)、学生所在班级名称(className)和学生班级班长(monitor)信息。以后,

可以直接从temp_student表中查询学生名称、班级名称和班级班长,而不用每次都进行联合查 询。这样可以提高数据库的查询速度。

3. 增加冗余字段

设计数据库表时应尽量遵循范式理论的规约,尽可能减少冗余字段,让数据库设计看起来精致、优雅。 但是,合理地加入冗余字段可以提高查询速度。

表的规范化程度越高,表与表之间的关系就越多,需要连接查询的情况也就越多。尤其在数据量大,而 且需要频繁进行连接的时候,为了提升效率,我们也可以考虑增加冗余字段来减少连接。

4. 优化数据类型

(1)对整数类型数据进行优化。

遇到整数类型的字段可以用 INT 型 。这样做的理由是,INT 型数据有足够大的取值范围,不用担心数 据超出取值范围的问题。刚开始做项目的时候,首先要保证系统的稳定性,这样设计字段类型是可以 的。但在数据量很大的时候,数据类型的定义,在很大程度上会影响到系统整体的执行效率。

对于 非负型 的数据(如自增ID、整型IP)来说,要优先使用无符号整型 UNSIGNED 来存储。因为无符号 相对于有符号,同样的字节数,存储的数值范围更大。如tinyint有符号为-128-127,无符号为0-255,多出一倍的存储空间。

(2)既可以使用文本类型也可以使用整数类型的字段,要选择使用整数类型。

跟文本类型数据相比,大整数往往占用更少的存储空间 ,因此,在存取和比对的时候,可以占用更少的 内存空间。所以,在二者皆可用的情况下,尽量使用整数类型,这样可以提高查询的效率。如:将IP地 址转换成整型数据。

(3)避免使用TEXT、BLOB数据类型

(4)避免使用ENUM类型

修改ENUM值需要使用ALTER语句。

ENUM类型的ORDER BY 操作效率低,需要额外操作。使用TINYINT来代替ENUM类型。

(5)使用TIMESTAMP存储时间

TIMESTAMP存储的时间范围1970-01-01 00:00:01 ~ 2038-01_19-03:14:07。TIMESTAMP使用4字节,DATETIME使用8个字节,同时TIMESTAMP具有自动赋值以及自动更新的特性。

(6)用DECIMAL代替FLOAT和DOUBLE存储精确浮点数

  1. 非精准浮点: float, double
  2. 精准浮点:decimal

Decimal类型为精准浮点数,在计算时不会丢失精度,尤其是财务相关的金融类数据。占用空间由定义的宽度决定,每4个字节可以存储9位数字,并且小数点要占用一个字节。可用于存储比bigint更大的整型数据。

总之,遇到数据量大的项目时,一定要在充分了解业务需求的前提下,合理优化数据类型,这样才能充 分发挥资源的效率,使系统达到最优。

5. 优化插入记录的速度

插入记录时,影响插入速度的主要是索引、唯一性校验、一次插入记录条数等。根据这些情况可以分别进行优化。

(1)MyISAM引擎的表:

① 禁用索引

② 禁用唯一性检查

③ 使用批量插入

插入多条记录时,可以使用一条INSERT语句插入一条数据,也可以使用一条INSERT语句插入多条数据。插入一条记录的INSERT语句情形如下:

insert into student values(1,'zhangsan',18,1);
insert into student values(2,'lisi',17,1);
insert into student values(3,'wangwu',17,1);
insert into student values(4,'zhaoliu',19,1);

使用一条INSERT语句插入多条记录的情形如下:

insert into student values
(1,'zhangsan',18,1),
(2,'lisi',17,1),
(3,'wangwu',17,1),
(4,'zhaoliu',19,1);

第2种情形的插入速度要比第1种情形快。

④ 使用LOAD DATA INFILE 批量导入

当需要批量导入数据时,如果能用LOAD DATA INFILE语句,就尽量使用。因为LOAD DATA INFILE语句导入数据的速度比INSERT语句块。

(2) InnoDB引擎的表:

① 禁用唯一性检查

插入数据之前执行set unique_checks=0来禁止对唯一索引的检查,数据导入完成之后再运行set unique_check=1。这个和MyISAM引擎的使用方法一样。

② 禁用外键检查

③ 禁止自动提交

6. 使用非空约束

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

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

相关文章

$route和$router的区别

$route 对象是一个包含当前路由信息的对象,它提供了对当前激活的路由的访问和控制。$route 对象具有以下属性: $route.path:当前路由路径的字符串表示。 $route.params:一个对象,包含动态路由参数和查询参数。 $rout…

Rust之构建命令行程序(三):重构改进模块化和错误处理

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序,我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先,我们的main函数现在执行两项任务:解析参数和…

adb、monkey的下载和安装

adb下载 官网网址:Downloads - ADB Shell 尽量不要下载最新的ADB Kits,因为兼容性可能不太好。 点击下载 ADB Kits 作者下载的版本是1.0.36 解压adb 到指定的目录即可。 然后把adb配置 环境变量。 检查adb是否安装成功

Java的特点及解析

Java 的一些主要特点及解析: 面向对象编程(OOP):Java 是一种面向对象编程语言,它将代码组织成多个相互关联的对象,每个对象具有特定的属性和行为。这种编程范式使得代码更易于理解、维护和扩展。 跨平台性…

React导航守卫(V6路由)

下载: npm i react-router-dom 当登录之后才可以去访问其他页面 (1)在登录页面,我们点击登录的时候,保存一个token,在登录页面引入重定向useNavigate import { useNavigate } from react-router-domconst navigate useNavigate()const l…

java数据库操作

数据库类分析 java.sql.DriverManager: 驱动管理器静态类,类加载时会自动加载配置文件中jdbc.drivers配置的驱动,所有数据库驱动类加载时会调用DriverManager.registerDriver注册自己到DriverManager中,如下代码,为or…

项目开发中安全问题及解决方法-----用户标识不能从客户端获取

服务端直接使用了客户端传过来的用户标识,导致了安全问题: GetMapping("wrong") public String wrong(RequestParam("userId") Long userId) {return "当前用户Id:" userId; }开发同学没有正确认识接口或服务…

Git学习笔记(第1章):Git概述

Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 Git易于学习,占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce 和…

常见的系统性能指标:QPS、TPS

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目…

华为设备NAT的配置

实现内网外网地址转换 静态转换 AR1: sys int g0/0/0 ip add 192.168.10.254 24 int g0/0/1 ip add 22.33.44.55 24 //静态转换 nat static global 22.33.44.56 inside 192.168.10.1 动态转换 最多有两台主机同时访问外网 AR1: sys int g0/0/0 ip add…

MySQL5.7之grant

官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.7.1.4 GRANT Statement 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Mysql5.7参考手册 / ... / 赠款声明 13.7.1.4 GRANT Statement GRAN…

享元模式介绍

目录 一、享元模式介绍 1.1 享元模式定义 1.2 享元模式原理 1.2.1 享元模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、享元模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 类图 2.2.2 具体实现 2.2.2.1 抽象享元类 2.2.2.2 共享享元类-白色棋子 2.2.2.3 共享享元…

计算机网络——运输层(1)暨小程送书

计算机网络——运输层(1)暨小程送书 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 运输层概述两个主要协议运输层和网络层的关系网络层运输层总结 多路复用与多路分解多路复用多路分解不同的技术实现时分复用(TDM)频分复…

[STM32F407ZET6] GPIO

GPIO模式 F4的GPIO功能比F1的功能更多一些, 但是整体框架一样. F4的输出配置和F1的不同, F4的配置后, 施密特触发器将会开启, 还会对输入寄存器进行采样读取. F1的配置后, 推挽输出将会关闭施密特触发器, 开漏模式读取会读输入寄存器, 推挽模式会读取输出寄存器的值. 输出(全…

Java毕业设计-基于jsp+servlet的家用电器购物商城管理系统-第87期

获取源码资料,请移步从戎源码网:从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的家用电器购物商城管理系统:前端 jsp、jquery、layui,后端 servlet、jdbc,角色分为管理员、用户;集成商品…

分布式Erlang/OTP(学习笔记)(一)

Erlang分布式基础 假设你在机器A和机器B上各跑着一个Simple Cache应用的实例。要是在机器A的缓存上插人一个键/值对之后,从机器B上也可以访问,那可就好了。显然,要达到这个目的,机器A必须以某种方式将相关信息告知给机器B。传递该…

macOS向ntfs格式的移动硬盘写数据

最近想把日常拍摄的照片从SD存储卡中转存到闲置的移动硬盘中,但是转存的时候发现,mac只能读我硬盘里的东西,无法将数据写入到移动硬盘中,也无法删除移动硬盘的数据。后来在网上查了许久资料,终于可实现mac对移动硬盘写…

修改iview的表格table展开的默认icon和样式

修改前 修改后 修改内容 .title_label_list .ivu-icon-ios-add{font-size: 26px;color: #888888; } .title_label_list .ivu-icon-ios-add:hover{color: #11AAAA; } .title_label_list .ivu-icon-ios-add:before {content: "\F341"; } .title_label_list .ivu-icon-…

Vue3/Vue2实现文章内容中多个“关键词“标记高亮显示

一、实现效果 下拉列表高亮展示关键词 二、实现思路 安装 “vue-word-highlighter” ,这是一个 支持 Vue3 和 Vue2,不过 Vue2 版本是通过 vue-demi 构建的 三、案例代码 package.json "vue-word-highlighter": "^1.0.4"Vue3 …

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书步骤说明

银河麒麟服务器操作系统搭建证书服务器并颁发可用于签名的证书的方法与前面Centos7上(centos7 使用openssl 配置证书服务器并颁发证书(史上最详细版本)_centos phpinfo显示的openssl配置项为/etc/pki/tls/openssl.c-CSDN博客)是一…