数据库中的数据结构以及查询过程
作者 | 川石信息
来源 | 今日头条
一、数据结构
数据结构通常会影响两个维度的优化:一是响应时间;二是资源消耗。
● 选择时数据类型的影响
选择数据类型通常应该遵守以下规则:
1.越小越好
所谓的越小越好是指数据类型所占的字节空间,即所占的内存情况。
2.数据类型越简单越好
通常来说越简单的数据类型,在处理时所消耗的CPU时间频率是最少的,数据类型越复杂,所消耗的CPU时间频率就会越长。例如时间、日期、IP地址等,之所以会这样是因为复杂的数据类型在比较时不是简单的ACSII比较,必须借用专门的函数来比较。
3.避免使用NULL
在定义表时,避免允许使用NULL,如果非要使用也是使用NOT NULL,因为NULL表示不是一个值,这样就不好比较。
● 常见数据类型说明
1.整型
整数又分为:TINYINT、smallint、mediumint、int、bignit,分别所点的字节数为8、16、24、32、64个字节空间
2.实型
实型分为:Float、double,分别占4个和8个字节
3.字符
字符类型又分两种:char和varchar
char是固定的大小,例如char(10),占10个字节。
varchar可变长度,例如varchar(10),如果执行我们没有用到10个字符,那么用到多少个就内存就会分配多少个,但是最多不超过10个字符,最后会有额外的字节用来做标识的。
4.日期与时间
日期与时间所点字节数与日期和时间的格式无关,固定的占8个字节
二、 查询过程
所有我们输入的SQL语句最后都会变成一个可执行的计划,放在CPU中来理解就是一个任务,每个CPU(如果CPU是单核的话)那么只同时处理一个任务,即CPU只能同时处理一个线程。
查询在运行的有不同状态:
1.休眠
等待新的查询
2.查询
线程正在执行查询或将查询的结果返回到客户端
3.锁定
表示表处于锁定状态
4.分析与统计
分析和统计相关的信息,并对查询进行优化
5.拷贝数据到临时表
将结果集的数据拷贝临时表
6.排序结果
对查询的结果进行排序
7.发送数据
发送数据一般理解将数据返回到客户端,也可以是查询状态之间的数据传递。
查看当前查询状态的命令如下:
SHOW FULL PROCESSLIST
查询过程的步骤如下:
1.客户端向服务器发送请求
借用于MYSQL的协议将客户端的请求发送到服务器端。MYSQL协议是一种半双工协议,即可以发送也可以接收数据。但不能同时发送和接受数据。
2.查询缓存
检查查询结果在缓存是否存在,如果在缓存就存在那么直接将缓存的数据发送给客户端即可,如果缓存中不存在我们需要的结果数据,那么到第三个步骤。
如果判断缓存中是否有我们需要的结果集的数据,是通过哈希查询来确定,是一种精确的哈希方法,并区别分大小写。
3.解析与优化查询
MYSQL会将我们的语句变成一个解析树,生成解析树会去检查语义、语法是否错误,判断表的信息是否正确等。
查询优化器是对我们的SQL语句进行优化最后变成一个查询执行计划。
通常优化的内容的包括以下部分:
- --->对连接表进行重新排序
- --->将外链接变成内链接进行查询
- --->代数等价法则,即关系运算符的处理
- --->优化聚合函数: count()、min()、max()
- --->计算和减少常量表达式
- --->覆盖索引
- --->子查询优化,将多个子查询转换为独立查询
- --->尽早终结,是指执行的查询语句不要写的过长
- --->优化in集合,优化in集合中的关系谓词
4.生成执行计划
将语句优化好的,会重新生成一个解析树,再将这个解析树生成一个可执行的计划。
5.查询引擎
对API函数对引擎进行操作,通过引擎到数据库中取数据。再将数据发送到客户端。
MYSQL数据库支持第三开发的引擎。