首页 > 编程知识 正文

mysql如何使用索引(mysql分表后使用sql)

时间:2023-05-03 12:58:59 阅读:87705 作者:24

今天给大家看大数据开发的基础部分MySQL的第一篇。 DDC谈论和别人不同的内容! 很多伙伴知道MySQL的基础知识和使用,但对里面的原理知之甚少。 我们学习知识光看表面是绝对不行的。 所以dddc的目标是让大家了解MySQL的体系结构知识。

MySQL架构篇的大纲如下。

希望看到DDC的这个内容后,你们能掌握以下内容:

Mysql的各组件和各组件的功能说明Mysql简易版执行流程和详细执行流程MyIsam和InnoDB的不同,说明使用场景Mysql的各日志文件的概念和相关作用

一、逻辑架构

-1010首先说明Mysql逻辑架构可以看到,Mysql由许多模块组合而成,每个模块都扮演着重要的角色。 以下介绍各个模块的作用

逻辑架构图

连接器。 指与不同语言的SQL进行对话。

目的是

连接器

集群的备份和集群管理。

管理

系统管理和控制工具

连接,进行权限验证等。

连接池

返回接收到DDL、DML等SQL命令后用户需要查询的结果。 但是,在收到SQL命令后,我们必须将其转换为有意义的SQL。 为了让系统知道你的这个SQL要做什么,需要解析SQL语句,所以需要解析器。

SQL接口

分析分为词法分析和语法分析,以词法分析和语法分析为例。

SQL命令在传递给解析器时由解析器进行验证和解析。 首先进行词法分析,分词为select、*、from、t1。 分析完成后,将形成语法树,进行语法分析,分析SQL语句是否正确。 如果错误,则表示该SQL语句不合理。

解析器

在前一步语法正确后传到这一部分。 在实际执行SQL语句之前,MySQL认为你的语句不是最佳的,并对其进行优化。 其中,使用explain显示的SQL语句执行计划由查询优化程序生成。

例如,select *来自用户网络名称' a % '和id=1; 这句话会被优化。 关于为什么要优化,后面会提到,先知道就行了,就是这样的词。 slect *来自用户网络名称=1and like ' a % ';

查询优化器

保存查询的结果,但对象是SQL语句散列的值,而不是SQL语句。 下次遇到相同的查询结果时,不去可插拔存储引擎,而是直接在缓存中发出查询结果。 (现在不怎么起作用了。 在新的MySQL中被删除了。 不再使用)

查询缓存

可插入式存储引擎(MySQL数据库)提供了各种各样的存储引擎。 它是用于保存数据的,包括所保存数据的索引方法和更新方法等。

在MySQL中,主要的存储引擎有MyIsam和In两种

noDB。

MyIsam是高速引擎,拥有较高的插入、查询速度。但不支持事务、行为等;

InnoDB是5.5版本后MySQL默认的数据库,支持事务和行级锁定,事务处理、回滚、崩溃修复能力和多版本并发控制,比MyIsam处理速度稍慢,支持外键。

那我们如何选择存储引擎类型呢?

InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那一般都会选择InnoDB。如果需要频繁的更新、删除操作的数据库,也可以选择InnoDB,因为它支持事务的提交和回滚。

MyIsam:插入数据快,空间和内存使用比较低。如果表主要是用于插入新纪录和读出记录,那么选择MyIsam能实现处理高效率。

下面dddc放一张MyIsam和InnoDB区别的图:

简版执行流程图

如何记住执行流程图?根据逻辑架构图各模块的执行顺序来记!

客户端:发送命令到连接器,连接器进行权限验证,权限验证通过后,客户端就可以继续发SQL命令了。连接器:负责跟客户端建立连接,获取权限。如果用户名或密码不对,会收到一个“Access denied for user”的错误。如果用户名和密码通过,连接器就会进入权限表里面查找你拥有的权限。查询缓存:连接建立完成后,就可以执行select语句,执行逻辑来到第二步:查询缓存,如果之前缓存过结果,就直接返回。分析器:如果没有命中查询缓存,就要开始真正执行语句,先做词法分析,再做语法分析。优化器:经过了分析器,MySQL就知道了你要干什么了,在开始执行之前,还要经过优化器处理。优化器是在表里面有多个索引的时候,决定使用哪个索引。执行器:通过分析器知道你要干什么,通过优化器知道该怎么做,于是现在进入执行器,开始执行语句。注意:在开始执行的时候,要先判断一下你对这个表有没有执行的权限,有权限就继续执行,没有权限就返回。如果有权限就打开表继续执行,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

详版执行流程图

说完简版的执行流程图,感觉差不多就可以了。但是当初学习的时候,还有一个详细版执行流程图,dddc也好好说说流程。

MySQL启动后,网络交互模块会在连接管理模块等连接,连接上来以后,会进入连接进程模块,再到用户模块,看你有没有用户权限,如果权限通过,就会把信息返回到连接管理模块,就可以登录了。接下来MySQL语句发下来到用户模块,用户模块还要检查你有没有操作表的权限,有权限就会到命令分发器,然后发到查询缓存模块。如果之前查过,就直接把结果返回(同时命令到达命令分发器,命令下来以后先去日志记录模块,记录日志)。紧接着命令到达命令解析器,看它是什么语句,根据不同类型的语句,进入到不同模块的优化器,优化器类型有:查询优化器、表变更模块、表维护模块、复制模块、状态模块。SQL语句现在到达访问控制模块,再次看一下有没有权限,看你有没有操作权限(insert权限,update权限之类的),如果这个权限没有问题,就会进入到表管理模块,调用存储引擎接口,然后调完以后,存储引擎向下拿数据(就是在文件系统里拿数据),再往回返。

到这一步,逻辑架构图就讲完了,大家可以好好捋捋思路和逻辑,一下就能记住。

二、物理结构

MySQL从物理结构上可以分为日志文件和数据索引文件,它在Linux中的数据索引文件和日志文件都在/var/lib/mysql目录下,并且日志文件采用顺序IO方式进行存储,而数据文件采用随机IO方式进行存储。

在这个地方提个问题:为什么日志文件采用顺序IO方式进行存储而数据文件采用随机IO进行存储?

首先简单说说顺序IO和随机IO,顺序IO在物理上是一块连续的存储空间,在进行顺序追加内容时,效率非常高。而随机IO从逻辑上看是连续的,物理上不是连续的,在对内容进行操作时,每次都需要找到文件在磁盘的位置。dddc简单说一下,顺序IO存储的优势是记录速度快,数据只能追加,这个就特别适合日志文件,因为日志文件特点也非常明显,记录日志信息,也不需要修改数据之类的,缺点就是浪费空间。数据文件可能经常需要修改之类的,存储的地址不是连续的,这个特别特别适合用随机IO,而且随机IO省空间,就是速度有点慢

日志文件

下面开始介绍日志文件中的各个日志,只介绍那些

错误日志(errorlog)

默认开启,记录每次运行过程中遇到的所有严重错误信息,以及MySQL每次启动和关闭的详细信息。

二进制日志(binlog)

这个太重要了,大家一定要记住!

默认关闭,它记录数据库中所有DDL语句和DML语句,但不包括select语句内容。DDL语句直接记录到binlog中,而DML语句必须通过事务提交才能提交到binlog中,它主要用于实现mysql主从复制、数据备份、数据恢复、

通用查询日志(general query log)

默认是关闭的,它会记录用户的所有操作,其中还包含增删改查等信息,在并发操作大的情况下会产生大量的信息,从而导致不必要的磁盘IO,会影响mysql性能。

慢查询日志(slow query log)

默认关闭,记录执行时间超过long_query_time秒的所有查询,收集查询时间比较长的SQL语句,可以用来提高查询性能。

重做日志(redo log)

它主要用来确保事务的持久性。防止在发生故障的时间点,尚有网页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

回滚日志(undo log)

它保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。

中国日志(relay log)

关于这个,dddc知道两个地方有用到它,一是mysql主从复制,二是canal同步mysql增量数据。主要就是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。

数据文件

InnoDB数据文件

.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息。.ibd文件:使用表独享表空间存储表数据和索引信息,一张表对应一个ibd文件。.bdata文件:使用共享表空间存储表数据和索引信息,所有表共同使用一个或多个ibdata文件

MyIsam数据文件

.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息。.myd文件:主要用来存储表数据信息。.myi文件:主要用来存储表数据文件中任何索引的数据树。

总结

本文作为大数据开发指南MySQL的第一篇详细介绍了MySQL架构内容,对各个模块以及流程进行了详细介绍,希望大家能够跟着dddc的文章,好好捋捋思路,争取能够用自己的话把这些知识点讲述出来!

尽管当前水平可能不及各位大佬,但dddc会努力变得更加优秀,让各位小伙伴自学从此不求人!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。