数据库-MySQL索引事务

发布于:2025-06-05 ⋅ 阅读:(16) ⋅ 点赞:(0)

1 索引

针对查询操作引入的优化手段 可以通过索引加快查询的速度 避免针对表遍历

  • 索引缺点:

1.占用更多空间,生成索引需要一系列数据结构 +一系列额外数据

2.可能会降低插入修改删除的速度

ps.如果这个表本来就很大,创建索引容易把数据库服务器卡住

技巧:额外搞一个机器,部署MySQL服务器,建好索引,再把数据导入

  • 数据库的索引

是一个改进的树形结构,B+树(N叉搜索树)

  1. B树/B-树 (一个节点划分N+1个区间)

2.B+树

  • 也是N叉搜索树
  • 一个节点划分N个区间
  • 每个节点中最后一个=当前子树最大值
  • 父节点的每个key都会以最大值身份出现在子节点对应区间中(key可能重复出现)
  • 使用链表 把叶子节点连接起来(易于完成数据集合遍历/方便获取某个范围的集合)

  • 优点:1)N叉搜索树,树的高度有限,降低IO次数 2)擅长范围查询 3)所有查询都要落在叶子节点,查询与查询之间时间开销稳定 4)叶子节点是全集 会把行数据存在叶子节点上 非叶子节点只是存储一个用来排序的key(比如id)
  • 底层逻辑:将非叶子节点缓存到内存中,虽然硬盘上还是要存非叶子节点,但是查询时把这些节点加载到内存中,比较过程就在内存中进行,进一步减少IO访问次数

1.1相关操作

1.查看索引

show index from 表名;

2.创建索引

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

3.删除索引

drop index 索引名 on 表名;

ps.手动创建的可以手动删除,如果是自动创建的(主键/外键,unique)就不可以删除

2 事务

CPU 负责进行算术运算和逻辑判断,执行任务的核心(大学生)

显卡(GPU)也能进行算术运算和逻辑判断(无数个小学生),比如游戏画面=一系列矩阵运su算,此时用显卡;

2.1回滚

日志的方式(打印出来内容 放在文件里 ) 记录事务中关键操作,这样的记录就是回滚的依据;即便主机掉电,重新启动主机/重启mysql,混滚日志依旧存在;

2.2事务特性

1)原子性 一系列操作要么都执行正确,要么都不执行(恢复如初)

2)一致性 事务执行之前/之后,数据都不能离谱(数据库的约束+一系列检查机制)

3)持久性 事务作出的修改,都是在硬盘持久保存的,重启服务器,数据仍然存在

4)隔离性 事务与事务间的影响力;两个事务间影响越大,隔离性越低;

并发执行,可能会

1.脏读问题 

一个事务A在写数据过程中,事务B读取同一个数据,A又改数据,导致B的数据是一个无效数据(脏数据);

解决:针对写操作加锁(写的时候不能读,都写完最终版了,才可以读)

2.不可重复读

并发执行时,事务A在内部多次读取一个数据时,出现不同的情况,在两次读取之间,B事务修改了数据;

解决:针对读操作加锁(A读的时候B不能写)

3.幻读

一个事务A执行过程中,两次的读取操作,数据内容虽然没变,但是结果集变了(A写完A1,B读A1,同时A又在写A2);

解决:引入串行化的方式,保持绝对串行执行事务(效率最低,数据最准);

2.3隔离级别

效率和正确性不能兼得 根据场景需求去看

可以直接在mysql配置文件中 修改数据库隔离级别

1.read uncommitted(读未提交) 并发程度最高 速度最快 隔离性最低 准确性最低

2.read committed(读已提交) 引入写加锁,只能读写完后提交的版本,并发程度降低,速度降低,隔离性提高,准确性提高

3.repeatable read(可重复读) 引入了写加锁和读加锁,写的时候不能读,读的时候不能写,并发程度降低,速度降低,隔离性提高,准确性提高;

4.serializable(串行化) 严格按照串行方式,并发程度最低,速度最低,隔离性最高,准确性最高;


网站公告

今日签到

点亮在社区的每一天
去签到