• MySQL 篇-快速了解事务、索引


    🔥博客主页: 【小扳_-CSDN博客】
    ❤感谢大家点赞👍收藏⭐评论✍
      

    文章目录

            1.0 事务概述

            1.1 事务四大特性(ACID)

            2.0 索引概述

            2.1 关于 “索引一定要创建在主键上?” 的问题

            2.2 索引操作语法

            2.3 索引结构


            1.0 事务概述

            事务是作为单个逻辑工作单元执行的一组数据库操作,要么全部成功执行,要么全部失败回滚,保证数据的完整性。

            默认 MySQL 的事务是自动提交的,也就是说,当执行一条 DML 语句,MySQL 会立即隐式的提交事务。

            用简单通俗的话来说,将 SQL 每一条语句都 “打包” 起来一起执行,如果某一条语句出现错误,则进行回滚操作,最终可以使得数据回复到原来的样子;如果 “打包” 在一起的语句都没有出现错误,则进行提交操作,数据就会进行相应的变化并保持持久性。

    语法结构:

    1. -- 开启事务,接下来的 SQL 语句都会打包起来
    2. start transaction;
    3. -- 如果这些语句都没有出现错误的话,可以提交事务
    4. commit;
    5. -- 如果这些语句,哪怕有一条语句出现错误,则操作回滚事务
    6. rollback;

            1.1 事务四大特性(ACID)

            1)原子性(A):事务是不可分割的最小单元,要么全部成功,要么全部失败。

            2)一致性(C):事务完成时,必须使所有数据都保持一致状态。

            3)隔离性(I):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。

            4)持久性(D):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

            2.0 索引概述

            在 MySQL 中,索引是一种数据结构,用于加快数据库表中数据的检索速度。通过在表的列上创建索引,可以帮助数据库系统快速定位到符合检索条件的记录,从而提高查询效率。

    索引的优点:

            提高数据查询的效率,降低数据库的 IO 成本。通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 消耗。


    索引的缺点:
            索引会占用存储空间,索引大大提高了查询效率,同时却也降低了 insert, update, delete 的效率。

            总的来说,优点大于缺点,实际中大多数的操作都是查询操作,至于插入、修改、删除的操作占小部分。

            2.1 关于 “索引一定要创建在主键上?” 的问题

            不,索引并不一定要创建在主键上。虽然主键通常会自动创建一个唯一索引,但在实际数据库设计中,还可以在其他列上创建索引以提高查询性能。
            在设计索引时,需要根据实际的查询需求和数据访问模式来选择合适的列进行索引。一些常见的情况包括:

            主键索引:主键用于唯一标识表中的每条记录,通常会自动创建一个主键索引。主键索引在查询单条记录时非常高效。


            外键索引:外键用于建立表与表之间的关联关系,可以在外键列上创建索引以加快关联查询的速度。


            经常用于查询的列:如果某个列经常用于查询条件或排序操作,可以考虑在该列上创建索引,以提高查询效率。


            经常用于连接的列:如果某个列经常用于连接操作(如 JOIN 语句),可以在连接列上创建索引,加速连接操作。

            补充:在 MySQL 中,默认加上主键约束、UNIQUE 约束都会自动创建索引

            2.2 索引操作语法

            1)创建索引

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

            2)查看索引

    show index from 表名;

            3)删除索引

    drop index 索引名 on 表名;

            4)举个例子,在创建图书表,表中的字段有 id, name, author, update_time ,为了通过查询书名来快速得到书的信息,就可以在书名这个字段创建索引。

    代码如下:

    1. create table books(
    2. id tinyint unique primary key comment '序号',
    3. name varchar(10) not null comment '书名',
    4. author varchar(10) not null comment '作者',
    5. update_time datetime comment '更新时间'
    6. )comment '图书';
    7. -- 添加数据
    8. insert into books
    9. values (1, 'Java', '小童', now()),
    10. (2, 'C++', '小鱼', now()),
    11. (3, 'Python', '小吴', now());

    创建索引:

    1. -- 创建索引在书名上,可以通过查找书名,快速找到
    2. create index index_books_name on books(name);

    查看表中的索引:

    1. -- 查看表中的所有索引
    2. show index from books;

            有两个字段创建了索引,一个主键 (id) 是默认创建了索引,另一个 (name) 是自己手动创建的索引。

    删除表中的索引:

    1. -- 删除表中的索引
    2. drop index index_books_name on books;

    再来查看表中的索引情况,

            可以看到 name 这个字段上的索引已经被删除了。

           

            2.3 索引结构

            在上面说到,索引就是一个数据结构,创建索引,就是在将该列中的数据按照规定的数据结构进行重新存储整理起来,从而在查询过程中,可以快速的查询相对应的数据。所以对于没有创建索引,查询指定的数据时,是通过全盘扫描的方式进行。

            那么 MySQL 中,索引是基于 B 树(B-tree) 或者 B+ 树(B+tree) 结构实现的,这些树结构是一种高效的数据结构,可以加速数据库表中的检索速度。

    B 树 (B-tree):
            B 树是一种平衡的多路搜索树,用于在数据库中存储和管理索引数据。B 树的特点是每个节点可以存储多个关键字,并且具有平衡性,保证查询的时间复杂度为 O(logN) 。在 MySQL 中,普通索引、唯一索引和主键索引通常都是基于 B 树结构实现的。


    B+ 树 (B+tree):
            B+ 树是在 B 树的基础上做了一些优化,更适合作为数据库索引的数据结构。B+ 树的非叶子节点只存储索引字段的值,而实际数据都存储在叶子节点上,这样可以减少磁盘 I/O 操作。B+ 树的叶子节点之间通过指针连接,形成一个有序链表,方便范围查询和排序操作。在 MySQL 中,InnoDB 存储引擎的聚簇索引(Clustered Index)就是基于 B+ 树结构实现的。

    对于 B+ 树来说:1)每一个节点可以存储多个 key (有 n 个 key ,就有 n 个指针)。2)所有的数据都存储在叶子节点,非叶子节点仅用于索引数据。3)叶子节点形成了一个双向链表,便于数据的排序及区间范围查询。

  • 相关阅读:
    适配器模式(Gateway中GatewayFilter和GlobalFilter整合实现)
    详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)
    Vue3 企业级优雅实战 - 组件库框架 - 6 搭建example环境
    Diffusion Model 深入剖析
    高效查单,将查到的物流信息导出表格保存
    微信支付APIv3
    LangGraph实战
    react,Chart
    CFDP:聚类算法
    使用svm-svc算法对乳腺癌进行预测
  • 原文地址:https://blog.csdn.net/Tingfeng__/article/details/136519314