MySQL复习day09:逻辑架构和引擎,索引详解(explain)

逻辑架构和引擎,索引

    • Linux版本MySQL的启停
    • MySQL的逻辑架构
    • MySQL引擎
      • MyISAM和InnoDB对比
    • 索引
      • 优势与劣势
      • 索引的分类
      • 索引语法
      • 索引结构
      • 索引设计原则
      • 索引最左前缀匹配原则
      • 索引性能分析
    • SQL的执行顺序
    • 常用的join查询
    • MySQL学习列表
    • 致谢



Linux版本MySQL的启停

  1.启动

service mysqld start

  2.停止

service mysqld start

MySQL的逻辑架构

1.连接层

 最上层为连接层,是一些客户端和连接服务,包含本地sock通信和大多数基于/服务端工具实现的类似TCP/IP的通信。主要完成一些类似于链接处理,授权认证,以及相关的安全方案。在该层引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2.服务层

 第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函效等,在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等, 最后生成相应的执行操作,如果是select语句, 服务器还会查询内部的缓存,如果缓存空间足多大, 这样在解决大量读操作的环境中能够很好的提升系统的性能。

3.引擎层

 存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍 MyISAM和 InnoDB。

4.存储层

 数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

MySQL引擎

1.查看存储引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.01 sec)

2.查看MySQL的默认存储引擎

mysql> show variables like "%storage_engine%";
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| default_storage_engine          | InnoDB    |
| default_tmp_storage_engine      | InnoDB    |
| disabled_storage_engines        |           |
| internal_tmp_mem_storage_engine | TempTable |
+---------------------------------+-----------+
4 rows in set (0.01 sec)

MyISAM和InnoDB对比

对比项 MyISAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作行有影响 行锁,操作时只锁某一行,不对其它个表,适合高并发的操作
缓存 只缓存索引,不缓存真实数据 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响,空间换时间
表空间
关注点 性能 事务
默认安装 Y Y

索引

b+tree和btree区别
请参考:https://blog.csdn.net/weixin_41948075/article/details/100180136

 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以简单理解为“排好序的快速查找数据结构”。InnoDB使用的是B+Tree。
 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第1张图片
 我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引等。

优势与劣势

优势

  1. 提高数据检索的效率,降低数据库的IO成本
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  3. 减少服务器需要扫描的数据量

劣势
4. 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
5. 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、 UPDATE和 DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
6. 索引只是提高效率的一个因素,如果你的MγSQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询

索引的分类

主要分为:单值索引,唯一索引,复合索引。

1) 单值索引 :即一个索引只包含单个列,一个表可以有多个单值索引
2) 唯一索引 :索引列的值必须唯一,但允许有空值null
3) 复合索引 :即一个索引包含多个列

索引语法

1.创建索引

CREATE  [UNIQUE|FULLTEXT|SPATIAL]  INDEX index_name [USING  index_type] ON tbl_name(index_col_name,...);
或者
ALTER mytable ADD 【UNIQUE】 INDEX 【indexName】 ON(columnname(length))

MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第2张图片
示例

mysql> create index empno on EMP(EMPNO);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

2.查看索引

show index  from  table_name;

3.删除索引

DROP  INDEX  index_name  ON  tbl_name

索引结构

索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的。所以每种存储引擎的索引都不一定完全相同, 也不是所有的存储引擎都支持所有的索引类型的。MySQL目前提供了以下4种索引:

  1. BTREE 索引 : 最常见的索引类型,大部分索引都支持 B 树索引。 (重点)

  2. HASH 索引:只有Memory引擎支持 , 使用场景简单 。

  3. R-tree 索引(空间索引):空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常 使用较少,不做特别介绍。

  4. Full-text (全文索引) :全文索引也是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从 Mysql5.6版本开始支持全文索引。

索引设计原则

1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中与其它表关联的字段,外键关系建立索引
4.频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录还会更新索引
5.where条件里用不到的字段不创建索引
6.单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
7.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
8.查询中统计或者分組字段

不适合索引的情况:

1.表记录太少
2.经常增删改的表,因为提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、 UPDATE和 DELETE。在更新表时, MySQL不仅要保存数据,还要保存一下索引文件。
3.数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。注意,如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。

索引最左前缀匹配原则

参考:
https://segmentfault.com/a/1190000015416513
 只有sql中where包含联合索引的首个字段的查询才能命中索引,这个叫索引的最左匹配特性。一般在程序设计时,where子句中使用最频繁的一列放在最左边,。联合索引的使用在写where条件的顺序无关,mysql查询分析会进行优化而使用索引。但是减轻查询分析器的压力,最好和索引的从左到右的顺序一致。

索引性能分析

1.MySQL query optimizer
 1)MySQL中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(机器认为最优的数据检索方式,但不见得是DBA认为是最优的
这部分最耗费时间)
 2)当客户端向MySQL请求一条 Query,命令解析器模块完成请求分类,区别出是 SELECT并转发给MySQL Query Optimizer时, MySQL Query Optimizer首先会对整条Query进行优化,处理掉一些常量表达式的预算,直接换算成常量值。并对 Query中的查询条件进行简化和转换,如去掉一些无用或显而易见的条件、结构调整等。然后分析 Query中的Hnt信息(如果有),看显示Hint信息是否可以完全确定该Query的执行计划。如果没有Hint或Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据 Query进行写相应的计算分析,然后再得出最后的执行计划。

MySQL常见瓶颈
 1.CPU:CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
 2.IO:磁盘IO瓶颈发生在装入数据远大于内存容量的时候
 3.服务器硬件的性能瓶颈:top,free,iostat和 vmstat米查看系统的性能状态

新手常见问题
 1.查询语句低效
 2.索引失效(包含单值索引和复合索引)
 3.关联查询太多join(设计缺陷或不得已的需求)
 4.服务器调优及各个参数设置(缓冲、线程数等)

MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第3张图片

explain
  使用explain关键字可以模拟优化器执行SQL查询语句,可以分析查询语句或者表结构的性能瓶颈。

mysql> explain select * from EMP;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | EMP   | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   14 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

上表说明:
idselect查询的序列号,表示查询中执行的select子句或操作表的顺序。标志着表的读取顺序。有三种情况:
 ①id相同,执行顺序由上至下;
 ②如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
 ③有的id相同,有的不同的情况时,id相同的为一组,从上外下执行,其余的必须满足id值越大,优先级越高,越先执行。

select_type查询的类型,主要是用于区别普通查询(simple),联合查询,子查询等复杂情况。表示数据读取操作的操作类型。
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第4张图片
table显示这部分的数据来自于哪张表

type: 显示访问类型排序,一般来说,得保证查询至少达到range级别,最好能够达到ref
在这里插入图片描述简记为:
在这里插入图片描述
type说明:

system :表主要一行记录(等于系统表),这是const类型的特例

const: 表示通过索引一次就能够找到,const用于比较primary key或者unique索引,通常比如where后接某个筛选主键。

eq_ref :唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。

ref :  查找条件列使用了索引而且不为主键和unique(一个普通的key)。即,虽然使用了索引,但该索引列的值并不唯一,有重复。
这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。
其好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。

range:只检索给定范围的行,使用一个索引来选择行。相对于index的全索引扫描,它有范围限制,因此要优于index。一定是基于索引的。同时除了显而易见的between,and以及'>','<'外,in和or也是索引范围扫描。

index: Full Index Scan,index与ALL区别为index类型只遍历索引树,这通常比ALL快,因为索引文件通常比数据文件小。index需要回表随机取数据

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

possible_keys和key
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null。

Key
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中,如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。查询中若使用了覆盖索引,则该索引仅出现在key列表中。

key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的),不损失精确性的情况下,长度越短越好

ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值.sql优化中rows一般是越小越好,代表所需扫描的表记录少,而filtered是越大越好,表明扫描的无用数据少,没有过多的多余的IO消耗。

rows
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数
extra
包含其他的一些重要信息

Using where  说明MySQL使用了where条件过滤数据(非索引和主键筛选条件)。通常会结合type进行进一步优化

using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
MYSQL中无法利用索引完成的排序操作称为“文件排序”。

using temporary 说明使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by和分组查询group by

using  index 表示相应的 select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!
如果同时出现using where,表明索引被用来执行索引键值的查找,需要回表;
如果没有同时出现 using where,表明索引用来读取数据而非执行查找动作,不需要回表。

Using index condition 命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。
这类SQL语句性能也较高,但不如Using index。

using join buffer  使用了连接缓存

SQL的执行顺序

MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第5张图片
总结
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第6张图片

常用的join查询

1.左外连接
全A
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第7张图片
A-B
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第8张图片

2.右外连接
全B
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第9张图片
B-A
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第10张图片

3.内连接
A∩B
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第11张图片

4.全外连接
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第12张图片
5.A∪B-(A∩B)
MySQL复习day09:逻辑架构和引擎,索引详解(explain)_第13张图片

MySQL学习列表

MySQL复习day01:数据库简介和 DQL数据查询语言
MySQL复习day02:DQL数据查询语言续
MySQL复习day03:DQL数据查询语言完结
MySQL复习day04:DML数据操作语言和DDL数据定义语言
MySQL复习day05:TCL事务控制语言和视图
MySQL复习day06:变量,存储过程
MySQL复习day07:函数
MySQL复习day08:流程控制结构
MySQL复习day09:逻辑架构和引擎,索引详解(explain)

致谢

感谢诸君观看,如果感觉有用的话,点个赞吧!



你可能感兴趣的:(数据库,索引,数据库,mysql)