SQL笔记之数据库结构优化方式

 更新时间:2024年01月24日 09:52:58   作者:Little.M_  
这篇文章主要介绍了SQL笔记之数据库结构优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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存储精确浮点数

  • 非精准浮点: float, double
  • 精准浮点: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. 使用非空约束

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解MySQL单列索引和联合索引

    详解MySQL单列索引和联合索引

    联合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏进行排序,然后按名字对有相同姓氏的人进行排序,这篇文章主要介绍了MySQL单列索引和联合索引,需要的朋友可以参考下
    2022-09-09
  • MySQL UPDATE多表关联更新的实现示例

    MySQL UPDATE多表关联更新的实现示例

    MySQL可以基于多表查询更新数据,本文主要介绍了MySQL UPDATE多表关联更新的实现示例,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • 深入解析mysql中order by与group by的顺序问题

    深入解析mysql中order by与group by的顺序问题

    本篇文章是对mysql中order by与group by的顺序问题进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 浅谈订单重构之 MySQL 分库分表实战篇

    浅谈订单重构之 MySQL 分库分表实战篇

    这篇文章主要介绍了 MySQL 分库分表方法的相关资料,需要的朋友可以参考下面文章内容,希望能帮助到你
    2021-09-09
  • MySQL性能优化神器Explain的基本使用分析

    MySQL性能优化神器Explain的基本使用分析

    这篇文章主要给大家介绍了关于MySQL性能优化神器Explain的基本使用分析,文中通过示例代码介绍的非常详细,对大家学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • MySQL8下忘记密码后重置密码的办法(MySQL老方法不灵了)

    MySQL8下忘记密码后重置密码的办法(MySQL老方法不灵了)

    这篇文章主要介绍了MySQL8下忘记密码后重置密码的办法,MySQL的密码是存放在user表里面的,修改密码其实就是修改表中记录,重置的思路是是想办法不用密码进入系统,然后用数据库命令修改表user中的密码记录
    2018-08-08
  • MySQL 5.0触发器参考教程

    MySQL 5.0触发器参考教程

    需要学习mysql触发器的朋友需要了解的东西,整理的比较多,建议大家慢慢多练习
    2008-09-09
  • 查看修改mysql编码方式让它支持中文(gbk或者utf8)

    查看修改mysql编码方式让它支持中文(gbk或者utf8)

    MySQL的默认编码是Latin1,不支持中文,要支持中文需要把数据库的默认编码修改为gbk或者utf8,真的是很麻烦啊,不过本文提供了详细的修改教程,感兴趣的你可不要走开啊,希望本文对你有所帮助
    2013-01-01
  • mysql_connect(): Connection using old (pre-4.1.1) authentication protocol refused

    mysql_connect(): Connection using old (pre-4.1.1) authentica

    MySQL错误提示:Connection using old (pre-4.1.1) authentication protocol refused (client option ‘secure_auth’ enabled)解决办法,需要的朋友可以参考下
    2014-04-04
  • MySQL DDL 引发的同步延迟该如何解决

    MySQL DDL 引发的同步延迟该如何解决

    这篇文章主要介绍了MySQL DDL 引发的同步延迟该如何解决,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-05-05

最新评论