MySQL架构和MySQL索引

1.  MySQL架构

1.1         逻辑架构图

1.1.1   Connection Pool: 连接池

* 管理缓冲用户连接,线程处理等需要缓存的需求。

* 负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。

* 而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

1.1.2   Parser: 解析器

* SQL命令传递到解析器的时候会被解析器验证和解析

主要功能:

a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。

b.  如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

1.1.3   Optimizer: 查询优化器

* SQL语句在查询之前会使用查询优化器对查询进行优化

*      它使用的是“选取-投影-联接”策略进行查询。

用一个例子就可以理解: select uid,name from user where gender = 1;

* 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行过滤

* 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤

* 将这两个查询条件联接起来生成最终查询结果

1.1.4   Cache和Buffer: 查询缓存

他的主要功能是将客户端提交给MySQL的 select请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

1.1.5   存储引擎接口

存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。

注意:存储引擎是基于表的,而不是数据库。

1.2   MySQL的存储引擎

* 多存储引擎是mysql有别于其他数据库的一大特性;

* 存储引擎是针对表的

* MySQL 5.5之后,默认的存储引擎由MyISAM变为InnoDB

* MySQL引擎: 可以理解为,MySQL的“文件系统”,只不过功能更加强大。

* MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。

* 查看存储引擎:show engines;

Innodb

Myisam

存储文件

.frm 表定义文件

.ibd 数据文件

.frm 表定义文件

.myd数据文件 .myi 索引文件

表锁、行锁

表锁

事务

ACID

不支持

CRDU

读、写

读多

count

扫表

专门存储的地方

索引结构

B+ Tree

B+ Tree

1.3   MySQL物理结构

1.3.1   日志文件

MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和 InnoDB 引擎在线 Redo 日志、中继日志等。

错误日志(error log):记录mysql服务器mysqld在启动/关闭或运行过程中遇到的错误信息。(默认是开启的,而且从5.5.7以后无法关闭错误日志)

查询日志(query log):

普通查询日志(general query log):记录客户端连接信息和执行的sql语句信息。(默认情况下通用查询日志是关闭的。)

慢查询日志(slow query log):记录执行时间超出指定值(long_query_time)的sql语句。(默认是关闭的。需要通过设置:slow_query_log=ON进行开启。)

二进制日志(binary log):记录数据被修改的相关信息。(默认是关闭的,需要通过配置:log-bin=mysql-bin进行开启)

在配置文件中进行配置各日志路径

1.3.2   数据文件

查看MySQL数据文件:SHOW VARIABLES LIKE ‘%datadir%’;

.frm文件:主要存放与表相关的数据信息,主要包括表结构的定义信息

.ibd和.ibdata文件:用来存储InnoDB存储引擎表数据和索引信息

.myd文件:主要用来存储使用MyISAM存储引擎的表数据信息

.myi文件:主要用来存储使用MyISAM存储引擎的表数据文件中任何索引的数据树。

2.  MySQL索引

一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname='css'的数据,是不是感觉性能提升了好多咧....

mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引.

单列索引:一个索引只包含一个列,一个表可以有多个单列索引.

组合索引:一个组合索引包含两个或两个以上的列,

2.1   索引的创建

2.1.1  单列索引

1.      普通索引,这个是最基本的索引

其sql格式是 :

CREATE INDEX IndexName ON `TableName`(`字段名`(length))

或者

ALTER TABLE TableName ADD INDEX IndexName(`字段名`(length))

2.      唯一索引,与普通索引类似,但是不同的是唯一索引要求所有的类的值是唯一的,这一点和主键索引一样.但是他允许有空值,

其sql格式是 :

CREATE UNIQUE INDEX IndexName ON `TableName`(`字段名`(length));

或者

ALTER TABLE TableName ADD UNIQUE (column_list)

3.      主键索引,不允许有空值,(在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位)

主键索引建立的规则是 int优于varchar,一般在建表的时候创建,最好是与表的其他字段不相关的列或者是业务不相关的列.一般会设为 int 而且是 AUTO_INCREMENT自增类型的

2.1.2  组合索引

一个表中含有多个单列索引不代表是组合索引,通俗一点讲 组合索引是:包含多个字段但是只有索引名称

其sql格式是 :

  CREATE INDEX IndexName On `TableName`(`字段名`(length),`字段名`(length),...);

2.2   索引的删除

删除索引的mysql格式 :

  DORP INDEX IndexName ON `TableName`;

(0)

相关推荐

  • 万字总结 MySQL核心知识,赠送25连环炮

    回复"000"获取大量电子书 前言 大家好,我是老田,之前写过 JVM.并发编程连环炮.然后有很多小伙伴私下找我就我继续把MySQL的连环炮整理出来,但是由于本人比较懒,又加上最近 ...

  • MySQL架构介绍(5.存储引擎)

    MySQL内建主流存储引擎主要死InnoDB和MyISAM 1)InnoDB MySQL默认的事务型存储引擎,当前互联网行业MySQL数据库的主流选择,主要用来处理大量短期事务,大部分正常提交,很少部 ...

  • MySQL基础篇(05):逻辑架构图解和InnoDB存储引擎详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.MySQL逻辑架构 1.逻辑架构图 基于下面的逻辑架构图,可以大致熟悉MySQL各个架构组件之间的协同工作关系. 很经典的C/S架构风格, ...

  • 10 分钟让你明白 MySQL 是如何利用索引的

    SQL专栏 SQL基础知识第二版 SQL高级知识第二版 一.前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对 MySQL 能否利用索引有一些迷惑. 譬如: MySQL 在遇到范围查询条 ...

  • 初探Mysql架构和InnoDB存储引擎

    前言 1.undo log和redo log了解过吗?它们的作⽤分别是什么? 2.redo log是如何保证事务不丢失的? 3.mysql的事务是先提交还是先刷盘? 4.更新操作为什么不直接更新磁盘反 ...

  • MySQL连接查询中索引的重要性

    在mysql中,我们要从多张表中读取数据时,往往需要用到连接查询.连接查询通过两张表中符合连接关系的字段来建立两张表的关联,通常包括内连接.左外连接.右外连接和全连接.内连接会保留两张表中共有的那部分 ...

  • MySQL全文索引、联合索引、like查询、json查询速度大比拼

    推荐阅读:从远程办公到简历被拒,再到斩获阿里offer,这份PDF功不可没 查询背景 有一个表tmp_test_course大概有10万条记录,然后有个json字段叫outline,存了一对多关系(保 ...

  • 大牛都是这样装MySql嘛?MySQL 零基础安装教程

    什么是MySql? MySQL 是最流行的关系型数据库管理系统,数据库(Database)是按照数据结构来组织.存储和管理数据的仓库. 在没有使用数据库之前,我们一般都是把数据存储在文件中的,但是对于 ...

  • Mysql:初识MySQL

    转载自:https://www.cnblogs.com/hellokuangshen/archive/2019/01/09/10246029.html Mysql:初识MySQL 只会写代码的是码农: ...

  • 开发者都需要了解的mysql索引四大存储引擎

    MySQL索引分为普通索引.唯一索引.主键索引.组合索引.全文索引.索引不会包含有null值的列,索引项可以为null(唯一索引.组合索引等),但是只要列中有null值就不会被包含在索引中. 接着让我 ...

  • MySQL索引失效底层原理分析,MySQL索引为什么失效,这篇文章全部告诉你

    前言 吊打面试官又来啦,今天我们讲讲MySQL索引为什么会失效,很多文章和培训机构的教程,都只会告诉你,在什么情况下索引会失效. 比如:没遵循最佳左前缀法则.范围查询的右边会失效.like查询用不到索 ...