后端进阶一步,MySQL 优化学习第1天

网友投稿 569 2022-05-29

任何一个后端工程师,都离不开数据库操作,而数据库中 MySQL 又是使用频率最高的一款,所以本系列专栏,将以3天一篇的频率,一起学习 MySQL 优化。

单表优化

从字段上,尽量使用 tinyint , smallint , mediumint 作为整数类型,而不是用 int ,如果存储的值非负的话,再使用 UNSIGNED 。

tinyint:占用1字节的存储空间,即8位(bit),取值范围 -127~127,在建表的时候要注意 tinyint(3) 可以,但是 tinyint(100) 还是 3 位,无符号范围是 0 到 255;

smallint:占用2字节,无符号范围 -32,768 到 32,767 ,无符号的范围是 0 到 65,535;

mediumint:占用3字节,无符号的范围是 0 到 16,777,215 ,带符号的范围是 -8,388,608 到 8,388,607;

int:最常用的,占用4字节,无符号的范围是 0 到 4,294,967,295,带符号的范围是从 -2,147,483,648到 2,147,483,647;

bigint:占用 8 个字节,范围很大!

这些数字只需要记住大概范围即可。

MySQL逻辑架构

MySQL逻辑架构可按照三层区分:

客户端层:建立链接部分,例如 Navicat 软件建立链接;

核心服务层:查询解析、分析、优化、缓存等都在这一层,存储过程,触发器,视图也在这一层;

存储引擎层:负责MySQL中的数据存储和提取。

在这里翻阅资料的时候,碰到了一个新的概念,通信协议中的半双工机制,与之对应的有 单工通信,半双工,全双工。

每个概念都可以进行简单的理解,例如:

全双工机制:双向同时进行,例如上传数据的同时还能下载数据;

单工通信:只能一方向另一方通信;

半双工机制:同一时刻只能一方向另一方通讯,MySQL客户端/服务端通信协议是半双工的,也就是在一瞬间,不是服务器向客户端发数据,就是客户端向服务器发数据,在发送的时候中间没有办法切断

基于这种机制,会出现如下场景,如果从客户端发送的数据包太大了,可能导致请求超时,反之服务器发送的数据过大,传输时间也会变长,所以我们要控制服务器(MySQL)给我们返回的数据,尽量避免使用 select * ,尽量加上 limit 限制返回条数。

这种操作的核心逻辑是降低通信数据包的大小和数量。

存储引擎层

今天咱们一起学习的最后一部分是MySQL存储引擎层。

目前接触最多的是 MyISAM 和 InnoDB 两种引擎,可以针对单表进行设置。

MyISAM

MyISAM 引擎是 MySQL 5.1 及之前版本的默认引擎,有如下内容:

不支持事务,不支持外键,是表锁,支持全文索引;

不支持安全恢复;

在表有读取查询的同时,支持往表中插入新纪录;

存储引擎表由MYD,MYI组成,MYD用来存放数据,MYI存索引;

支持压缩表(该表不会被修改,例如枚举表),大幅度减少磁盘空间占用,可以 myisampack 工具。

InnoDB

InnoDB 在 MySQL 5.5 后成为默认引擎,它的特点是:

支持事务,外键,支持行锁,支持高并发;

支持安全恢复;

MySQL 5.6 已支持全文索引。

其它差别

InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描,当然如果加了 where 语句 ,二者差异不大。

MyISAM 用一个变量保存了整个表的行数,所以上述语句的执行速度很快;

InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。正是因为这个原因,一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。

基于上述内容,如果执行大量的SELECT,选择 MyISAM,如文章表;如果执行大量的 INSERT或UPDATE ,优先选择 InnoDB 表,如订单表。

后端再进阶一步,MySQL 优化学习第1天

然后在翻阅资料的时候,又发现一句总结:没啥特殊的话请使用 InnoDB ,瞬间简洁了~~

MySQL

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python--__del__析构函数(二十六)
下一篇:完全备份、差异备份、增量备份的区别
相关文章