MySQL 数据库 索引和事务

目录
  • 1. 索引
    • 1.1 概念
    • 1.2 作用
    • 1.3 索引的原理
      • 1.3.1 减少磁盘的访问次数是构建索引的核心思想
      • 1.3.2 B+ 树适用实现索引的底层
    • 1.4 适用场景
    • 1.5 使用语句
      • 1.5.1 查看索引
      • 1.5.2 创建索引
      • 1.5.3 删除索引
  • 2. 事务
    • 2.1 概念
    • 2.2 为什么使用事务
    • 2.3 四大属性
      • 2.3.1 原子性
      • 2.3.2 一致性
      • 2.3.3 持久性
      • 2.3.4 隔离性
    • 2.4 使用方法

1. 索引

1.1 概念

  • 索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。索引是针对表而建立的,它是由数据页面以外的索引页面组成的,每个索引页面中的行都会含有逻辑指针,以便加速检索物理数据。
  • 在数据库关系图中,可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。

通俗的讲,索引与数据库中的表和数据的关系就类似于书架上的图书(表)、书籍内容(数据)和书籍目录(索引)的关系

1.2 作用

在数据库系统中建立索引主要有以下作用:

  • 快速取数据
  • 保证数据记录的唯一性
  • 实现表与表之间的参照完整性
  • 在使用 order by、group by 子句进行数据检索时,利用索引可以减少排序和分组的时间

1.3 索引的原理

1.3.1 减少磁盘的访问次数是构建索引的核心思想

索引的目的是方便进行查询。
MySQL 的查询主要是 selectselect 基本执行的过程包括遍历表、依次取出每个记录、根据 where 字句的条件进行筛选
由于 MySQL 是把数据储存在硬盘上,因此进行查询时,每次取出记录都意味着要访问硬盘
而 IO 设备对硬盘的访问效率远低于对内存的访问,因此减少磁盘的访问次数就可以提高查询的效率,也就是构建索引的核心思路

1.3.2 B+ 树适用实现索引的底层

减少对数据的访问次数就是实现索引时的重要思想,接下来将会对几种数据结构进行分析,以找到更适合的实现索引的数据结构

二叉搜索树:

由于二叉搜索树可能是一个单支树,时间复杂度为 O(N)

AVL 树:

  • AVL 树本质是一个二叉平衡搜索树,是对二叉搜索树的一个改进,它会保证了左右子树的高度差不超过1,即不会存在单支树的结构,查找时间复杂度为 O(logN)
  • 因为需要满足左右子树高度差不超过1的条件,所以插入或者删除操作会破坏 AVL 树的结构。因此需要随时对树进行调整。虽然查询效率得到了满足,但是降低了插入和删除操作的效率,插入删除时间复杂度为 O(logN)

红黑树:

  • 红黑树本质是一个放松了规则的 AVL 树,即不要强制左右子树高度差不超过1,会降低要求,以此来保证插入和删除操作的效率。
  • 整体和 AVL 树差异不大,查询插入删除的时间复杂度为 O(logN)

哈希表:

  • 哈希表可以做到查询、插入、删除的时间复杂度都是 O(1)
  • 但是哈希表的一个关键是必须要比较相等,但是形如大于、小于之类的条件无法做到,这就和实际查询的情况不符合了

到这里为止,好像只有 AVL 树或者红黑树更加适合用作 MySQL 的索引的实现,而这两个数据结构的查找效率直接是由树的高度决定的,因此数据增多的话,树的高度也会增加。

为了进一步优化,就可以使用 N 叉搜索树来降低树的高度,即减少磁盘 IO,以提高查找效率

B 树:

B 树是 N 叉搜索树的一种

B 树示例结构:

用在索引中,每个结点都表示一个记录

B 树的特点:

  • 每个结点可能包含 N 个子树
  • 每个结点上都可能存在多个值
  • 左子树的值都小于根节点的对应值,右子树的值都大于根节点的对应值

B+ 树:

B+ 树是一种特殊的 N 叉搜索树,是 B 树的改进版

B+ 树示例结构:

 B+ 树相对于 B 树的改进:

  • 叶子节点存储每行记录,非叶子节点只要存储每行的索引值即可
  • 非叶子节点的值存在重复,使得叶子结点这一层是完整的数据集合
  • 可以通过类似于链表的方式,把所有的叶子节点连接起来

B+ 树的优势:

  • 善于进行范围查找
  • 由于所有的查询都是落在叶子结点上,故查询的速度是比较稳定的
  • 由于叶子结点是数据的全集,因此就可以把叶子结点存到硬盘上,非叶子结点直接存到内存中,大大降低了读取硬盘的次数

1.4 适用场景

  • 查找的次数比较多,插入删除的次数较少适合用索引
  • 由于索引本身也占据一定空间,如果磁盘紧张就不太适合用索引
  • 索引是指定某个列来建立的,当某列的区分度比较大的时候,适合用索引,例如自增主键

1.5 使用语句

补充:

创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建对应列的索引

1.5.1 查看索引

语法:

show index from 表名;

示例:

1.5.2 创建索引

语法:

create index 索引名 on 表名(字段名);

示例:

1.5.3 删除索引

语法:

drop index 索引名 on 表名;

示例:

注意:

主索引不能删除,删除会报错

2. 事务

2.1 概念

事物:是属于计算机中一个很广泛的概念,一般是指要做的或所做的事情。在关系数据库中,一个事务可以是一条 SQL 语句或者一组 SQL 语句或整个程序。

通俗的讲,比如银行转账的操作,A 转给 B 500元,那么这个操作其实包含了 A 账户余额减少500元和 B 账户余额增加500元两个操作。

事物就相当于将这一连串的动作给打包,使其成为一个整体,要么全都不做,要么全都做完

2.2 为什么使用事务

用上述银行转账的例子为例,假设 A 账户减少500元的操作成功了,但 B 账户增加500元的账户没有成功,那么这个转账的操作是失败的。

事物的核心特点就是: 把一系列操作给打包到一起,构成一个整体,要么全都做完,要么一个都不做。

全都不做是指: 如果某个操作失败了,那么就会将此时的中间状态偷偷还原回去

因此使用事物的话就可以保证,某一系列的操作,不会只完成其中一部分,它要么完全完成,要么都没有完成

2.3 四大属性

事务是恢复和并发控制的基本单位,它具有四个属性:原子性、一致性、持久性、隔离性

事物的核心是原子性

2.3.1 原子性

概念:

一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

事物的核心是原子性,原子性的核心是回退为中间状态,回退为中间状态核心就是回滚,回滚的核心就是记住每步的操作

2.3.2 一致性

概念:

事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

执行事物之前和执行事物完成后,当前表里的数据都是合理的状态

2.3.3 持久性

概念:

持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

事物操作的数据都是直接操作硬盘,而硬盘的数据都是持久化的

2.3.4 隔离性

概念:

一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

2.4 使用方法

开启事物:

start transaction;

执行多条 SQL 语句

回滚或提交

-- 回滚:表示上述 SQL 语句全部失败
rollback;

-- 提交:表示上述 SQL 语句全部成功
commit;

到此这篇关于MySQL 数据库 索引和事务的文章就介绍到这了,更多相关MySQL 索引和事务内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL数据库的事务和索引详解

    目录 一.事务: 事务四大特性: 并发事务带来哪些问题?(隔离所导致的一些问题) 事务隔离级别有哪些? MySQL的默认隔离级别: 二.索引: 索引的作用: 索引的分类: 索引准则: 索引的数据结构: 总结 一.事务: 事务是逻辑上的一组操作,要么都成功,要么都失败! ---------------------------------- 1.SQL执行        A:1000元     -->转账200元        B:200元 2.SQL执行        A:800元       -

  • Mysql数据库高级用法之视图、事务、索引、自连接、用户管理实例分析

    本文实例讲述了Mysql数据库高级用法之视图.事务.索引.自连接.用户管理.分享给大家供大家参考,具体如下: 视图 视图是对若干张基本表的引用,一张虚表,只查询语句执行结果的字段类型和约束,不存储具体的数据(基本表数据发生了改变,视图也会跟着改变),方便操作,特别是查询操作,减少复杂的SQL语句,增强可读性. 1.----创建视图: create view 视图名称(一般以v_开头) as 查询语句; 2.----查看视图: select * from 视图名称; 3.----删除视图: dro

  • MySQL 数据库 索引和事务

    目录 1. 索引 1.1 概念 1.2 作用 1.3 索引的原理 1.3.1 减少磁盘的访问次数是构建索引的核心思想 1.3.2 B+ 树适用实现索引的底层 1.4 适用场景 1.5 使用语句 1.5.1 查看索引 1.5.2 创建索引 1.5.3 删除索引 2. 事务 2.1 概念 2.2 为什么使用事务 2.3 四大属性 2.3.1 原子性 2.3.2 一致性 2.3.3 持久性 2.3.4 隔离性 2.4 使用方法 1. 索引 1.1 概念 索引是为了加速对表中数据行的检索而创建的一种分散

  • 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树! 学过数据结构的一般对最基础的树都有所认识,因此我们就从与我们主题更为相近的二叉查找树开始. 一.二叉查找树 (1)二叉树简介: 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 1.任意节点左子树不为空,则左子树的值均小于根节点的值: 2.任意节点右子

  • MySQL数据库索引的最左匹配原则

    目录 一. 联合索引说明 二. 那ac是否能用到索引呢? 三. 思考 四. 最左匹配原则的成因 一. 联合索引说明 建立三个字段的联合索引 联合索引(a,b,c)相当于建立了索引:(a),(a,b),(a,b,c) 二. 那ac是否能用到索引呢? 先给出结论:a可以命中联合索引(a,b,c),c无法命中,所以ac组合无法命中联合索引. 1.建立abc联合索引(province,city,district) ac索引查询 SELECT * FROM user_address WHERE provi

  • MySQL数据库索引的弊端及合理使用

    目录 合理利用索引 1.普通索引的弊端 2.主键索引的陷阱 3.联合索引的矛与盾 4.前缀索引的短小精悍 5.唯一索引的快与慢 6.不要盲目加索引 7.索引失效那些事 索引优化 1.change buffer 2.索引下推 3.刷新邻接页 4.MRR 最后 一个好的索引对数据库系统尤其重要,索引可以说是数据库中的一个大心脏了,如果说一个数据库少了索引,那么数据库本身存在的意义就不大了,和普通的文件没什么两样.今天来说说MySQL索引,从细节和实际业务的角度看看在MySQL中B+树索引好处,以及我

  • MySQL数据库索引以及失效场景详解

    目录 1. MySQL索引概述 1.1 索引的概念 1.2 索引的特点 1.3 索引的分类 1.4 索引的使用场景 2. 索引失效场景 2.1 索引失效9种场景 2.2 索引失效场景总结 3. 索引失效验证 3.1 全值匹配 3.2 最佳左前缀 3.3 索引计算 3.4 索引范围:索引列上不能有范围查询 3.5 索引覆盖:尽量使用覆盖索引 3.6 不等: 使用不等于(!= 或者 <>)的时候 3.7 null:字段的is not null 与is null 3.8 like:like的前后模糊

  • MySQL数据库索引原理及优化策略

    目录 1 索引 索引概念 索引作用 索引的使用场景 2 索引分类 B树索引和B+树索引区别 3 索引操作 创建主键索引 唯一索引的创建 普通索引的创建 查询索引 删除索引 索引创建原则 1 索引 索引概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针.可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现. 索引作用 数据库中的表.数据.索引之间的关系,类似于书架上的图书.书籍内容和书籍目录的关系,索引所起的作用类似书籍目录,可用于快速定位.检索数据.索引可以

  • mysql数据库索引损坏及修复经验分享

    mysql表索引被破坏的问题及解决 下午上班,惊闻我的dedecms的网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为: Table '.\dedecmsv4\dede_archives' is marked as crashed and should be repaired 提示说cms的文章表dede_archives被标记有问题,需要修复.于是赶快恢复历史数据,上网查找原因.最终将问题解决.解决方法如下: 找到mysql的安装目录的bin/myisamchk工具,在命令

  • Mysql数据库索引面试题(程序员基础技能)

    引言 索引是Mysql的一块硬骨头,但是对于程序猿来说又是十分重要的基础技能.在平常的项目开发中,它是重要的SQL优化手段.在求职面试中,它是面试官常常用来考察求职者数据库性能优化方面的重要考量.因此透彻的掌握索引原理,并能够将其运用到数据库查询实战是每个程序猿必备的能力.本文将从索引原理.索引设计原则方面阐述Mysql索引.相信阅读完本文之后,在Mysql索引查询数据理解这块完全可以征服阿里面试官.准备好了吗?我们发车了. 索引原理 在进行索引设计以及优化之前,我们先深入理解下索引的原理.因为

  • MySQL数据库索引order by排序精讲

    排序这个词,我的第一感觉是几乎所有App都有排序的地方,淘宝商品有按照购买时间的排序.B站的评论有按照热度排序的... 对于MySQL,一说到排序,你第一时间想到的是什么?关键字order by?order by的字段最好有索引?叶子结点已经是顺序的?还是说尽量不要在MySQL内部排序? 事情的起因 现在假设有一张用户的朋友表: CREATE TABLE `user` ( `id` int(10) AUTO_INCREMENT, `user_id` int(10), `friend_addr`

  • MySQL数据库索引order by排序精讲

    目录 事情的起因 解剖文件排序 文件排序很慢,还有其他办法吗 不想回表,不想再次排序 总结 排序这个词,我的第一感觉是几乎所有App都有排序的地方,淘宝商品有按照购买时间的排序.B站的评论有按照热度排序的... 对于MySQL,一说到排序,你第一时间想到的是什么?关键字order by?order by的字段最好有索引?叶子结点已经是顺序的?还是说尽量不要在MySQL内部排序? 事情的起因 现在假设有一张用户的朋友表: CREATE TABLE `user` ( `id` int(10) AUT

随机推荐