Mysql

Mysql

索引的原理

索引用来快速找到指定值,不用便利整张表,将无序的数据转换为有序。

原理是将索引列数据转换成哈希值,对哈希值进行排序生成倒排表,之后在倒排表中拼上地址链。

查询的时候先拿到倒排表,然后找到地址连,拿到具体数据

聚簇索引和非聚簇索引的区别(都是B+树结构)

聚簇索引:将索引和数据存在一起,找到索引就是找到数据,适合范围查询。聚簇索引的叶子节点就是数据节点

非聚簇索引:索引和数据分开存储,叶子节点是索引节点但是有指向数据的指针。

一般主键会默认创建聚簇索引,一张表只能有一个聚簇索引

Mysql存储引擎

索引的数据结构

B+树:平衡多叉树,叶子节点有双向指针,利用双向指针快速移动,范围查询效率高。

哈希:一张哈希表,利用哈希算法算出哈希值,根据哈希值找到地址。在单条查询效率非常高。

索引设计原则

  1. 常用与查询的数据列创建索引
  2. 基数较小的表不要创建索引
  3. 使用短索引
  4. 索引不要创建过多,占用磁盘空间,维护麻烦
  5. 外键创建索引
  6. 更新频繁的字段避免创建索引

mysql锁

属性:共享锁和排他锁

粒度:

共享锁:读锁,一个事务添加读锁之后其他事务就不能再添加写锁只能添加读锁,为了支持并发读取数据。

排他锁:写锁,只能加一把,其他事务不能再加了。

表锁:锁住整个表

行锁:一行或多行

页锁:行级锁和表级锁之间的一种锁,速度快,冲突多。

间隙锁:行锁的一种

事务的基本特性和隔离级别

ACID

原子性:事务操作要么都成功,要么都失败

一致性:事务执行前后的数据时一致的

隔离性:一个事务提交前不受其他事务影响

持久性:事务一旦提交,所做的修改就会永久保存

隔离级别

读未提交:读到了其他事务未提交的数据,造成脏读

读已提交:两次读取的数据不一致,造成不可重复读

可重复读:mysql默认的隔离级别,每次读取的结果一样,可能造成幻读

串行化:一个事务一个事务执行,效率极低

脏读:一个事务更改了数据,另一个事务读取了更改的数据,前一个事务回滚了,读取到了脏数据。

不可重复读:一个事务的两次查询中数据不一致,可能是中间插入了事务更新了数据。

幻读:一个事务查询数据,另一个事务在此时添加了数据,接着查询发现几列数据是原来没有的。

处理慢查询语句

看看是不是查询条件是不是没有命中索引,是否加载了不需要的数据列,相应的重写sql语句。查看是不是数据量太大,适当进行分库分表。

ACID靠什么保证

原子性靠undolog日志保证,记录了需要回滚的日志信息,回滚时候撤销执行成功的sql

一致性由其他三大特性保证,程序代码保证业务的一致性

隔离性由mvcc保证

持久性靠redolog保证保证宕机可以通过日志将数据保存到磁盘

MVCC

多版本并发控制,读数据时通过类似快照的方式将数据保存下来,读写锁就不冲突了

Myisam和innodb的区别

Myisam不支持事务,每次查询都是原子性的,支持表级锁,非聚簇索引

innodb支持acid事务,支持四种隔离级别,支持行锁和外键

索引类型

主键

唯一

全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隋zy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值