Mysql进阶-索引事务相关

news2025/1/24 22:44:29

文章目录

    • 数据库存储引擎
        • INNODB
        • MYISAM
    • 索引
    • 索引分类
    • 索引语法
    • SQL性能分析
      • SQL执行频率
      • 慢查询
      • profile详情
      • explain 执行计划
        • **Etrax**(额外信息)
          • using index condition
          • using where;using index
          • using where
    • 索引使用规则
      • 最左前缀法则
        • 范围查询
      • 索引失效情况
        • 1.索引列运算
        • 2.字符串不加引号
        • 3.模糊查询
        • 4.or连接的条件
        • 5.and连接
        • 6.数据分布影响
      • SQL提示(修改使用的索引)
      • 前缀索引
    • 索引设计原则
    • 并发事务带来的影响
    • 事务隔离级别

数据库存储引擎

1.创建表时,指定存储引擎
注意存储引擎是以表为单位的

CREATE TABLE table_name (
		字段1  字段1类型
		....
)ENGINE = INNODB;

不指定 ENGINE = INNODB,mysql5.5版本以上默认就是INNODB

2.查看当前数据库支持哪些存储引擎

show engines;

INNODB

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在MySQL 5.5 之后是默认存储引擎

特点

  1. DML操作遵循ACID模型,支持事务
  2. 行级锁,提高并发访问性能;
  3. 支持外键FOREIGN KEY约束,保证数据的完整性和正确性;

文件
xxx.idb: xxx代表的是表名,innoDB引擎的每张表都会对应这样的一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。
可以在存放表空间文件的目录下打开cmd,然后运行 ibd2sdi xxxx.idb,就可以查看这个表空间文件的sdi数据

MYISAM

  • 早些年使用,节约空间,速度快
MYISAMINNODB
事务支持不支持支持
数据行锁定不支持支持
外键约束不支持支持
全文索引支持不支持
表空间大小较小较大,约2倍

文件
xxx.sdi: 存储表结构信息
xxx.MYD:存储数据
xxx.MYI:存储索引

对于数据的一致性要求高,是重要的数据,要求事务的就选用innodo引擎,对数据的一致性要求不高,偶尔丢失一两条数据也没关系的,例如日志信息,足迹信息等,就可以选用Myisam引擎(但目前市场上该需求主要被mangodb代替了)

索引

索引(index)是帮助MySQL高效获取数据数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

  • 索引的优缺点
    在这里插入图片描述

  • 索引结构
    在这里插入图片描述

  • B+Tree索引
    MySQL索引数据结构对经典的B+Tree进行了优化,在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问性能
    在这里插入图片描述
    B+Tree只在叶子节点存储数据,而BTree在叶子和非叶子都存储数据

  • Hash索引
    1.Hash索引只能用于对等比较(=,in),不支持范围查询(between,>, <, …)
    2.无法利用索引完成排序操作
    3.查询效率高,通常只需要一次检索就可以了,效率通常要高于B+Tree索引

    Hash索引只有Memory引擎支持

为什么InnoDB存储引擎选择使用B+tree索引结构?

  1. 相对于二叉树,层级更少,搜索效率高;
  2. 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页存储的键值减少,指针跟着减少,要保存同样大量的数据,只能增加树的高度,(而树当中不同层的页可能存放在磁盘不同的位置上,这样就需要多次I/O读取,大大消耗性能),导致性能降低;
  3. 相对Hash索引,B+tree支持范围匹配即排序操作(B+tree的叶子节点种形成了双向链表,便于范围搜索和排序

索引分类

在这里插入图片描述

Innodb引擎的聚簇索引(主键索引)的叶子节点上存放的是数据本身,而MyISAM引擎(默认非聚簇索引)的聚簇索引和非聚簇索引(二级索引,辅助索引)的叶子节点存放的是指向数据的物理地址

聚集索引也叫聚簇索引
一般会用主键构建聚集索引,叶子节点中除了主键值,还有这条数据的具体信息;而二级索引就是用户自己增加的唯一索引,普通索引这种,它们都是采用B+tree的数据结构存储,但二级索引的叶子节点存储的是这个字段以及主键值
在这里插入图片描述
InnoDB主键索引的B+tree高度为多高呢
假设:一行数据的大小为1k,一页中可以存储16行这样的数据。InnoDB的指针占用6个字节的空间,主键即使为bigint,占用字节数8
在这里插入图片描述
因此数据如果大概超过2000w的数量级,需要开始考虑分库分表

索引语法

create index 索引名 on 表名(字段名);
create unique index 索引名 on 表名(phone);
create index 索引名 on 表名(字段1,字段2,字段3);
drop index 索引名 on 表名;
show index from 表名 (查询表的全部索引)

SQL性能分析

SQL执行频率

show global status like ‘Com_______’;

可以查看当前数据库的insert、update、delete、select的访问频次
在这里插入图片描述

慢查询

慢查询日志记录了所有执行时间超过指定参数(long_query_time, 单位:秒,默认10秒)的所有SQL语句的日志。
MySQL的慢查询日志默认没有开启

show variables like ‘slow_query_log’;
查看是否有开启

需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=2

profile详情

执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时:

 # 查看每一条SQL的耗时基本情况
 show profiles;
# 查看指定query_id的SQL语句各个阶段的耗时情况
show profile for query query_id;

# 查看指定query_id的SQL语句CPU的使用情况
show profile cpu for query query_id;

explain 执行计划

在这里插入图片描述

explain select xxxxx 或者 desc select xxx 可以查询这个查询语句的执行计划,具体参数含义如下:

  • id
    select 查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)。
  • select_type
    表示SELECT的类型,常见的取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION中的第二个或者后面的查询语句)、SUBQUERY(SELECT/WHERE之后包含了子查询)等
  • type
    表示连接类型,性能由好到差的连接类型为NULL、system、const、eq_ref、ref、range、index、all。
    一般select不访问表的时候才会为NULL,因此在实际业务中不太可能优化到NULL
    使用主键/唯一索引作为查询条件,那么连接类型为const,不是唯一索引连接类型为ref,
    index:【index】会遍历索引树,index回避ALL速度快一些,但是任然有使用不对的地方
  • possible_key
    显示可能应用在这张表上的索引,一个或多个
  • key
    实际使用的索引,如果为NULL,则没有使用索引
  • Key_len
    表示索引中使用的字节数,该值为索引字段最大的可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好
  • rows
    MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值,可能并不总是准确的
  • filtered
    表示返回结果的行数占需读取行数的百分比,filtered的值越大越好

Etrax(额外信息)

using index condition

查找使用了索引,但是需要回表查询数据

using where;using index

Using index 和 Using where 的同时出现表示查询利用了索引加速数据检索,并在索引扫描后使用了额外的条件过滤来获取最终的结果。这通常是一个相对高效的执行计划,但仍然需要考虑索引的选择性、数据量和其他查询条件对性能的影响。
重点例子

在这里插入图片描述
该表是有 age_name的联合索引,没有单独的name索引,这里的where只用了 name字段
不符合最左前缀法则,但通过Extra得知任然使用了索引,而type又为index,所以真实是走了索引,但是因为缺少联合索引的最左字段age,没有了顺序,因此它是遍历了索引树,根据name的条件找到了数据,所以Extra中还有Using where,因为该表只有三个字段 id,age,name ,所以该联合索引的目标叶子节点上有需要的所有数据,不再需要回表,

using where

该属性与using index相反,查询的列并没有被索引覆盖,需用用未建立索引的字段进行数据过滤,有两种情况
1.where name = 1 ,name字段并没有设置索引(因此没走索引,走全表,但又需要用name进行过滤
2.where name > 1, 由于数据分布,导致mysql最终没有选择走索引(nam>1的数据选择性太高,优化器认为走全表扫描更快)也是没走索引,走全表,但也需要name字段进行过滤

索引使用规则

最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则,最左前缀法则指的是查询从索引最左列开始,并且不能跳过索引中的列。 最左的列只需要存在即可,顺序可以不按照索引顺序
如果跳跃某一列,索引将部分失效(后面的字段索引失效)

范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的索引失效
可以用 >= 的方式来让右侧的索引不失效
在这里插入图片描述

索引失效情况

1.索引列运算

不要在索引列上进行运算操作,索引将失效

explain select * from tb_user where substring(phone, 10, 2) = ‘15’;

2.字符串不加引号

字符串类型字段使用时,不加引号,依然能查询到数据,但是索引将失效

explain select * from tb_user where phone = 17799990015;

3.模糊查询

如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。

4.or连接的条件

用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到,只有两个都有索引才会走索引
如果or前后的两个字段是联合索引,依然不会走索引,and的时候才会走

5.and连接

如果and连接的两个字段 a,b都是单列索引,那么mysql将只走一个索引,or的时候则两个都会走

6.数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引。(如果要查询的数据占全数据的大部分则则全表,否则走索引
同理,is null 和 is not null也会根据实际该字段的数据分布,如果大部分都是null,则 is null不走索引,反之

select * from tb_user where phone >= ‘17799990005’; 走全表扫描
select * from tb_user where phone >= ‘17799990015’; 走索引

SQL提示(修改使用的索引)

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
1.use index:
建议使用索引,sql可能不接受

explain select * from tb_user use index(索引名) where profession = ‘xxxx’;

2.ignore index
忽略 该索引

3.force index
强制使用该索引

前缀索引

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

create index 索引名 on 表名(字段名(截取的位数));

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

select count(distinct email) / count() from tb_user; 查询去重的email数量占总数的多少,如果为1代表 唯一
select count(distinct substring(email, 1 , 5))/ count(
) from tb_user; 截取email从1开始的5个字符,并去重后占总数的多少

索引设计原则

在这里插入图片描述

并发事务带来的影响

  • 脏读

事务A,读取到了事务B还未提交的更改后的数据

  • 不可重复度

事务A,读取到了事务B已经提交了的数据,和之前读取未提交的数据不一致,导致了不可重复读

  • 幻读

事务A查询不到某条数据,但是插入该条数据就会报错已存在

小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

事务隔离级别

在这里插入图片描述
READ UNCOMMITTED(读未提交):事务中的修改即使未提交也是对其它事务可见
READ COMMITTED(读提交):事务提交后所做的修改才会被另一个事务看见,可能产生一个事务中两次查询的结果不同。
REPEATABLE READ(可重读):只有当前事务提交才能看见另一个事务的修改结果。解决一个事务中两次查询的结果不同的题。
SERIALIZABLE(串行化):只有一个事务提交之后才会执行另一个事务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/521528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

conda故障处理

【已解决】subprocess-exited-with-error 准备元数据(setup.py)…错误 错误:subprocess-exited-with-error python setup.py egg_info运行失败。 │退出代码:10 <╰>[1行输出] 请指定——curl-dir/path/to/built/libcurl [输出结束] 注意:此错误源自子进程&#xf…

Halcon 形态学(膨胀(Dilation)、腐蚀(Erosion))

文章目录 1 形态学概念2 膨胀(Dilation) 算子介绍3 腐蚀(Erosion)算子介绍4 膨胀腐蚀 示例15 腐蚀膨胀 示例26 示例原图7 补充:结构元素概念1 形态学概念 图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。 通过改变局部区域的像素形态…

单链表OJ题:LeetCode--面试题:02.04 分割链表

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode面试题&#xff1a;02.04.分割链表 数 据 结 构&#xff1a;数据结构专栏 作 者&#xff1a;stackY、 LeetCode &#xff1a;LeetCode刷题训练营 LeetCode面试题&#xff1a;02.04.分割…

H5微信授权登录弹窗提示

如下图&#xff1a;用户授权登录前&#xff0c;先通过静默授权&#xff0c;拿到token&#xff0c;展示部分信息&#xff0c;用户通过授权后拿到头像昵称&#xff0c;该弹窗让用户有个比较好的体验 1、标签 <template><!--遮罩--><view v-if"showAuth"…

MD-MTSP:遗传算法GA求解多仓库多旅行商问题(提供MATLAB代码,可以修改旅行商个数及起点)

一、多仓库多旅行商问题 多旅行商问题&#xff08;Multiple Traveling Salesman Problem, MTSP&#xff09;是著名的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;的延伸&#xff0c;多旅行商问题定义为&#xff1a;给定一个&#x1d45b;座城市的城市集…

开发一个自定义“套壳“浏览器的开源方案

一.项目概述 二.技术选型 三.项目介绍 1.项目地址:​​​​​​https​​​​​​://github.com/keyxh/TLC_Browers 2.项目目录介绍: 3.项目后期 开发语言:VB6 浏览器内核:webview2 项目目的:在vb6调用h5&#xff0c;实现自定义的浏览器 参考资料: https://github.com…

从 Spring 的创建到 Bean 对象的存储、读取

目录 创建 Spring 项目&#xff1a; 1.创建一个 Maven 项目&#xff1a; 2.添加 Spring 框架支持&#xff1a; 3.配置资源文件&#xff1a; 4.添加启动类&#xff1a; Bean 对象的使用&#xff1a; 1.存储 Bean 对象&#xff1a; 1.1 创建 Bean&#xff1a; 1.2 存储 B…

BUUCTF--reverse1,reverse2--WP

文章目录 一.BUUCTF--reverse1二.BUUCTF--reverse2 一.BUUCTF–reverse1 这道题目也是非常简单&#xff0c;主要考察IDA Pro的使用&#xff0c;分析代码&#xff1a; 发现是64位exe&#xff0c;直接拖到IDA Pro中&#xff0c;发现没有找到主函数&#xff1a; 那就直接ShiftF12…

【操作符详解 2023-05-13】

#include <stdio.h>int main() {int a 1;int b 2;int c (a > b, a b 10, a, b a 1);//逗号表达式printf("%d\n", a);printf("%d\n", b);printf("%d\n", c);return 0; }int main() {int arr[10] { 1,2,3,4,5 };// …

等差数列求和,轻松解决力扣“K 个元素的最大和”问题

本篇博客会讲解力扣“2656. K 个元素的最大和”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是输出示例&#xff1a; 以下是提示&#xff1a; 本题有2种思路&#xff0c;一种是直接按照题目所说的方式模拟&#xff0c;另一种是直接使用数学公式。 显然…

STM32f103时钟树详解

一、概述 stm32有四种时钟信号源&#xff0c;HSE(高速外部时钟)、HSI&#xff08;高速内部时钟&#xff09;、LSE&#xff08;低速外部时钟&#xff09;、LSI&#xff08;低速内部时钟&#xff09;。HSE通常接8M晶振&#xff0c;经由内部分频和倍频&#xff0c;最大可得到72MH…

荔枝派Zero(全志V3S)驱动开发之RGB LED灯

文章目录 前言一、硬件连接二、文件 IO 方式操作 GPIO三、编写驱动四、编写应用程序1、V1 版本&#xff0c;实现蓝灯亮灭2、V2 版本&#xff0c;实现蓝灯闪烁 五、编译六、运行测试七、资源自取方式1&#xff1a;github 链接方式2&#xff1a;百度网盘 前言 一、硬件连接 查看…

绝~ 阿里内部“Java进阶必备宝典”,理论到实战,一键通关

前言 作为一名Java方向的程序员&#xff0c;打好夯实的基础是非常重要的&#xff0c;现在大厂面试对于程序员基础知识的掌握考察也越来越严格&#xff0c;虽然说现在技术更新比较快&#xff0c;但基础扎实才能够更深入的去理解每一个知识技术点。 关于Java程序员如何筑基&…

实现“省市县的联动”

分析&#xff1a;实现这一功能需要发送三次Ajax请求 1.第一次请求&#xff1a;是页面加载完毕之后&#xff0c;发送一次Ajax请求&#xff0c;查询出所有的省级单位&#xff0c;将这些查询结果展示在<select>标签中。 2.第二次请求&#xff1a;当所选省级单位发生变化的时…

java工程构建时带上分支,commit等信息

背景&#xff1a; 线上部署的jar包&#xff08;不管是直接运行jar包&#xff0c;还是通过容器运行的jar&#xff09;有时出现问题时需要查看源代码&#xff0c;需要知道该jar包是从哪个分支、哪个commit、哪个时间打包的。 有了这些信息能更好辅助我们分析判断问题。 这里以gr…

【.NET基础加强第九课--事件】

.NET基础加强第九课--事件 Event 关键字委托,事件对比举例: 音乐播放事件用户对象&#xff0c;登录程序集反射 Event 关键字 委托,事件对比 委托是一种数据类型&#xff0c;可以用调用。 事件:对象&#xff08;对委托的一种封闭装&#xff09;。只能在类内部&#xff0c;只能…

基于Java的企业员工管理系统的设计与实现(论文+源码)_kaic

基于Java的企业员工管理系统的设计与实现 摘 要 随着电子信息的飞速发展&#xff0c;计算机已经融入到了生活的各个方面&#xff0c;越来越多的企业开始使用电子计算机来对企业进行管理&#xff0c;信息化的时代已经到来&#xff0c;各个企业无论大小都需要一个信息化的管理系…

模拟实现qsort函数(采用冒泡排序的方式)

前言&#xff1a; 之前我在C语言&#xff1a;指针详解【进阶】后篇中提到了qsort函数,qsort函数作为一个库函数&#xff0c;在我们日常的代码编写中可能会用到&#xff0c;在上面提到的文章中我们也进行使用了这个函数&#xff0c;大家也了解了一些这个函数的使用方法&#xff…

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一

English Learning - L3 作业打卡 Lesson1 Day4 2023.5.8 周一 引言&#x1f349;句1: They may say they are red hot about something unfair.成分划分弱读连读爆破语调 &#x1f349;句2: When they are red hot, they are very angry about something.成分划分弱读连读爆破语…

【Ansys】mechanical和fluent求解器中使用的迭代方法-待补充

一、mechanical求解器 这个求解器&#xff0c;在网上很容易查到&#xff0c;迭代求解时用的就是牛顿-拉夫逊方法&#xff08;Newton-Raphson&#xff09;。 这是因为牛顿法求解非线性问题非常优秀。 而mechanical使用这个方法就能实现对几何非线性、材料非线性、接触非线性、…