MYSQL

存储引擎

MySQL体系结构


在这里插入图片描述

  • 数据存储以及提取的方式 服务器会通过API以及存储引擎来进行同行以及交互
  • 索引在存储引擎层,是数据库中的关键
  • 存储引擎控制的是数据库的数据如何来存,如何来取,如何来组织,具体的数据库中的数据是存储在磁盘中
  • 存储层主要存数据库的相关数据,以及错误日志,查询日志,慢查询日志。

存储引擎简介

存储引擎概念:存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。

默认InnoDB


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


存储引擎特点

InnoDB
介绍

  • InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL5.5之后,InnoDB是默认的 MySQL存储引擎。
    特点
  • DML(增删改哦)操作遵循ACID(原子性,一致性,隔离性,永久性) 模型,支持事务
  • 行级锁,提高并发访问性能;
  • 支持外键FOREIGN KEY约束,保证数据的完整性和正确性;
    磁盘文件
  • xxx.ibd:xxx代表的是表名,innoDB引的每张表都会对应这样一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引
  • 参数:innodb file_per table

在这里插入图片描述


查看表结构的数据结构


查看表结构的数据结构

在这里插入图片描述


MyISAM

  • 介绍:MyISAM是MySQL早期的默认存储引擎。
  • 特点
  • 不支持事务,不支持外键支持表锁,不支持行锁
  • 访问速度快
    文件
    xxx.sdi:存储表结构信息
    xxX.MYD:存储数据
    XXXMYI:存储索引

Memory
介绍
Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用,
特点
内存存放
hash索引(默认)
文件
xxx.sdi:存储表结构信息


在这里插入图片描述


存储引擎选择


在这里插入图片描述
存储引擎选择
在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组
o

  • innoDB:是Mysql的默认存储引,支持事务、外键。如果应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么lnnoDB存储引擎是比较合适的选择。

  • MySAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。日志,足迹. mongodb取代

  • MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性.
    redis取代

在这里插入图片描述


索引

索引概述

  • 概念:**索引(inqex)是帮助MySQL高效获取数据的数据结构有序。**在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查算法,这种数据结构就是索引。
    在这里插入图片描述
    优点
    优势:
  • 提高数据检索的效率,降低数据库的IO成本
  • 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。

劣势

  • 索引列也是要占用磁盘空间空间的 myi结尾文件就是存放索引的文件
  • 索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE时,效率降低。

索引结构

mysql中默认的存储引擎就是InnoDB 支持B+Tree索引 索引在存储引擎层
存储引擎层索引结构包括:
B+Tree索引 最常见的索引
hash索引 底层使用哈希表实现的,只有精确匹配索引列的查询才有效,而且不支持范围查询 性能很高

r-tree(空间索引) myISAM 引擎的一种特殊的索引类型,主要用户地理空间数据类型通常使用比较少
full-text(全文索引) 通过建立倒排索引,快速匹配文档的方式。
在这里插入图片描述


在这里插入图片描述


二叉树-----------------------------顺序插入 一个节点有两个子节点
红黑树: 大数据情况下,层级比较深,检索速度慢

在这里插入图片描述


B-Tree(多路平衡查找树)
以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针):

有n个key的的话,有n+1个指针

在这里插入图片描述


数据可视化网站(https://www.cs.usfca.edu/~galles/visualization/Algorithms.html)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
以4阶的b+tree
所有元素都会出出现在叶子节点,分页子节点起到的是索引的作用,叶子节点是一个链表结构,存放数据,每一个节点的指针都会指向下一个节点,
分页子节点索引 单向链表 指针指向下一个元素

MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能。

在这里插入图片描述


在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


Hash
哈希索引就是采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中如果两个(或多个)键值,映射到一个相同的槽位上,他们就产生了hash冲突(也称为hah碰撞),可以通过链表来解决。
计算每一行的hash值,拿到name字段的所有值,通过内部的hsah函数,根据内部的hash函数计算哪一个name值落到了哪一个槽位 。
hash冲突:链表解决
在这里插入图片描述
特点:
在这里插入图片描述

  1. Hash索引只能用于对等比较(=,in),不支持范围查询《between,>,<,…
  2. 无法利用索引完成排序操作
  3. 查询效率高,通常(hash碰撞)只需要一次检索就可以了,效率通常要高于B+tree索引
    存储引擎支持
    在MysQL中,支持hash索引的是Memory,而innoDB中具有自适应hash功能能,hash索引是存储引擎根据B+Tree索引在指定条件下自动构建的。

为什么InnoDB存储引擎选择使用B+tree索引结构?
相对于二叉树,层级更少,搜索效率高.
对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
相对Hash(只支持等值匹配)素引,B+tree支持范围匹配及排序操作

索引分类

唯一索引 手机号 用户名
id 主键索引 只能有一个

主键索引. 唯一索引 .常规索引 全文索引

主键索引hi只能有一个 其他可以有多个
在这里插入图片描述


Inno DB 聚集索引 二级索引

聚集索引:必须存在 只能有一个聚集索引,特点:叶子节点下边挂着,是这一行的数据,默认主键索引就是聚集索引,如果没有主键索引,会找最近的一个唯一索引,既没有主键也没有唯一索引,mysql会自动生成一个rollid作为聚集索引.

二级索引:特点:叶子节点下边挂着的是主键.

在这里插入图片描述
聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。
  • 如果表没有主键,或没有合适的唯一索引,则innoDB会自动生成一个rowid作为隐藏的聚集索引。

  • 聚簇索引以及非聚簇索引

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

索引语法

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
查看索引
在这里插入图片描述


在这里插入图片描述
默认b+树的数据结构


2在这里插入图片描述


3
在这里插入图片描述


在这里插入图片描述
4


在这里插入图片描述
删除索引


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

SQL性能分析

SQL执行频率
MySQL客户端连接成功后,通过 show[sessionlglobal] status 命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:
在这里插入图片描述


在这里插入图片描述


慢查询日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位: 秒,默认10秒)的所有SQL语句的日志
.MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:
在这里插入图片描述


需要在MySQL的配置文件(/etc/my.cnf)中添加配置如下信息:
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
有记录会输出
在这里插入图片描述


在这里插入图片描述


profile详情
show profiles 能够在做SqL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:
在这里插入图片描述


在这里插入图片描述
show profiles查看所有耗时情况


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


索引使用 索引失效

前置知识

在这里插入图片描述
创建索引的字段与未创建索引的字段进行比较,
添加过索引的字段比没有创建索引的字段查询速度快很多
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
执行计划的基本信息
在这里插入图片描述

最左前缀法则:

①如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。
匹配最左前缀法则,走索引:
违法最左前缀法则 , 索引失效:
如果符合最左法则,但是出现跳跃某一列,只有最左列索引生效:
如果顺序不同,索引也是生效的
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结:
在这里插入图片描述


② 范围查询: 范围查询右边的列,不能使用索引
在这里插入图片描述
解决方案 业务允许时在这里插入图片描述
③ 列运算:不要在索引列上进行运算操作, 索引将失效。
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


④ 字符串:**字符串不加单引号,造成索引失效。由于,在查询时没有对字符串加单引号,MySQL的查询优化器,会自动的进行类型转换,造成索引失效。


在这里插入图片描述

⑤ 模糊查询:以%开头的like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。 通过覆盖索引来解决


在这里插入图片描述


在这里插入图片描述


索引使用


在这里插入图片描述


在这里插入图片描述


数据分布影响 取决于数据分布情况

如果MysQL评估使用索引比全表更慢,则不使用索引。会走全表扫描
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


SQL提示


在这里插入图片描述
1 user 用哪个索引
2 ignore不要用哪个索引
3 force 必须用哪个索引
idx_user_pro 为索引名称


如果一个字段有两中索引一个联合以及单列索引,mysql会自动选择一个sql索引
在这里插入图片描述


覆盖索引


尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少 select * 容易出现回表查询

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
对username password 做联合索引


前缀索引

当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。


在这里插入图片描述


前缀长度
可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。


在这里插入图片描述


对文本索引进行截取
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


单列索引与联合索引

①单列索引: 即一个索引只包含单个列。
②联合索引:即一个索引包含了多个列。


在这里插入图片描述


-单列索引如果是两个条件进行查询,只是用到了一个索引,会进行回表查询
在这里插入图片描述


-联合索引, 不用回表查询 创建联合索引需要考虑顺序 遵循最左前缀法则
在这里插入图片描述


在这里插入图片描述


索引设计原则

  • 针对于数据量较大,且查询比较频繁的表建立索引。
  • 针对于常作为查询条件(where)、排序 (order by)、分组(group by) 操作的字段建立索引。
  • 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。
  • 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。
  • 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。
  • 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询.

总结

在这里插入图片描述
聚集索引:必须存在 只能有一个聚集索引,特点:叶子节点下边挂着,是这一行的数据,默认主键索引就是聚集索引,如果没有主键索引,会找最近的一个唯一索引,既没有主键也没有唯一索引,mysql会自动生成一个rollid作为聚集索引.

二级索引:特点:叶子节点下边挂着的是主键.


在这里插入图片描述

sql优化

插入数据


尽量进行批量插入

在这里插入图片描述
在这里插入图片描述


手动提交事务

在这里插入图片描述


主键顺序插入

在这里插入图片描述


大批量插入数据

如果一次性需要插入大批量数据,使用inset语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述
在mysql上传脚本 赋值标签 ll
在这里插入图片描述
执行数据 赋值文件名

在这里插入图片描述

在这里插入图片描述


主键优化

主键顺序插入性能高于乱序插 入
数据组织方式:在innoDB存储引擎中,表数据都是根据主键顺序组织存放的,这种存储方式的表称为索引组织表index organized table l0T)。


在这里插入图片描述


在这里插入图片描述


页分裂
页可以为空,也可以填充一半,也可以填充100%。每个页包含了2-N行数据(如果一行数据多大,会行溢出),根据主键排列。

在这里插入图片描述


主键设计原则

  • 满足业务需求的情况下,尽量降低主键的长度
  • 插入数据时,尽量选择顺序插入,选择使用AUTO INCREMENT自增主键
  • 尽量不要使用UUID做主键或者是其他自然主键,如身份证号
  • 业务操作时,避免对主键的修改。

在这里插入图片描述


order by优化


①Using flesot:通过表的索引或全表扫描,读取满足条件的数据行,然后在排序缓冲区sot buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSot 排序。
②Using index:通过有序索引顺序扫描直接返回有序数据,这种情况即为using index,不需要额外排序,操作效率高。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
  • 尽量使用覆盖索引。
  • 多字段排序一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
  • 如果不可避免的出现filesort,大数据量排序时,可以适当增大排序缓冲区大小 sort buffer size(默认256K)。

在这里插入图片描述


在这里插入图片描述


建立联合索引
在这里插入图片描述
在这里插入图片描述


-在这里插入图片描述


在这里插入图片描述


创建索引的时候 age是第一个字段 phone 是第二个字段排序的时候恰好相反违背了最左前缀法则所以会出现using filesort ,比较好的效率是:using index
在这里插入图片描述


默认是升序 都有索引遵循最左前缀法则 则也会出现using filesort,比较好的效率是:using index
在这里插入图片描述


解决办法 根据排序进行索引设置

在这里插入图片描述

在这里插入图片描述


group by优化 分组优化


在这里插入图片描述
在分组操作时,可以通过索引来提高效率
分组操作时,索引的使用也是满足最左前缀法则的


在这里插入图片描述


在这里插入图片描述


limit优化


一个常见又非常头疼的问题就是limit 200000,10的记录,其他记录丢弃,查询排序的代价非常大。
,此时需要MySQL排序前2000010 记录,仅仅返回2000000- 2000010
查询优化
在这里插入图片描述


优化 覆盖索引+子查询
在这里插入图片描述


count优化


存储引擎决定的
在这里插入图片描述


  • 尽量使用count (id),遍历整张表
    count(字段值),count (0) ; count(*)最慢
    在这里插入图片描述
    在这里插入图片描述

count 不计数null值 所以需要注意如果字段中有null值 应该尽量避免使用该字段的count计数
在这里插入图片描述


在这里插入图片描述


update优化


事务
在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


总结

在这里插入图片描述


视图/存储过程触发器

概述

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源CPU、RAM、1/0)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

全局锁

表级锁

行级锁

innoDB 引擎

MySQL管理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值