当前位置:网站首页>Mysql数据库的几个特点
Mysql数据库的几个特点
2022-06-23 06:23:00 【qq_37279783】
导读:0.存储引擎MyISAM和InnoDB区别 1.事物级别 2.聚集索引和非聚集索引 3.回表 4.explain执行计划
0.存储引擎MyISAM和InnoDB区别
MyISAM
- 不支持事务,所以每次查询都是原子的;
- 支持表级锁,即每次操作是对整个表加锁;
- 存储表的总行数;
- 一个MYISAM表有三个文件:索引文件、表结构文件、数据文件;
- 采用非聚集索引(Non-clustered),索引文件的数据域存储指向数据文件的指针。
InnoDb
- 支持ACID的事务;
- 支持行级锁及外键约束;
- 不存储总行数;
- 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个,受操作系统文件大小的限制;
- 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;
- 使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。
1. 事物级别
查询隔离级别:SHOW VARIABLES LIKE 'transaction_isolation%';
读未提交 Read uncommitted
读未提交其实就是事务没提交就可以读,很显然这种隔离级别会导致读到别的还没提交的数据,一旦基于读到的数据做了进一步处理,而另一个事务最终回滚了操作,那么数据就会错乱,而且很难追踪。总的来说说,读未提交级别会导致脏读。
读提交 Read committed
顾名思义就是事务提交后才能读,假设你拿着银行卡去消费,付钱之前你看到卡里有2000元,这个时候你老婆在淘宝购物,赶在你前面完成了支付,这个时候你再支付的时候就提示余额不足,但是分明你看到卡里的钱是够的啊。
这就是两个事务在执行时,事务A一开始读取了卡里有2000元,这个时候事务B把卡里的钱花完了,事务A最终再确认余额的时候发现卡里已经没有钱了。很显然,读提交能解决脏读问题,但是解决不了不可重复读。
Sql Server,Oracle的默认隔离级别是Read committed。
可重复读 Repeatable read
看名字就看出来了,它的出现就是为了解决不可重复读问题,事务A一旦开始执行,无论事务B怎么改数据,事务A永远读到的就是它刚开始读的值。那么问题就来了,假设事务B把id为1的数据改成了2,事务A并不知道id发生了变化,当事务A新增数据的时候却发现为2的id已经存在了,这就是幻读。
MySQL的默认隔离级别就是Repeatable read。
串行化 serializable
这个就是最无敌的存在了,所有的事务串起来一个个执行,因为没有并发的场景出现了,什么幻读、脏读、不可重复读统统都不存在的。但是同样的,基本并发能力会非常差。最终,到底什么隔离级别完全要根据自己的业务场景选择,没有最好的,只有最适合的。
2.聚集索引和非聚集索引
聚集索引
- 一个表只能有一个
- 存储记录是物理上连续存在
- 叶子节点就是数据节点,存储的数据本身
非聚集索引
- 一个表存在多个:普通索引,唯一索引,全文索引
- 存储记录是逻辑上的连续,物理存储并不连续
- 叶子节点是数据的聚集索引的key,一个指针指向对应的数据块
3.回表
通过非聚集索引查找的过程是先找到该索引key对应的聚集索引的key,然后再拿聚集索引的key到主键索引树上查找对应的数据
4.explain执行计划
4.1 select_type列:表示 SELECT 的类型
常见的取值
- SIMPLE(简单表,即不使用表连接 或者子查询)。
- PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或 者后面的查询语句)
- SUBQUERY(子查询中的第一个SELECT)
4.2 type列:表示表的连接类型
性能由好到差的连接类型为:
- system(表中仅有一行,即常量表)。
- const(单表中最多有一个匹配行,例如primary key或者unique index)。
- eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)。
- ref(与eq_ref类似,区别在于不是使用primary key或者unique index,而是使用普通的索引)。
- ref_or_null(与ref类似,区别在于条件中包含对NULL的查询)。
- index_merge(索引合并优化)。
- unique_subquery(in的后面是一个查询主键字段的子查询)。
- index_subquery(与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询)。
- range(单表中的范围查询)。
- index(对于前面的每一行,都通过查询索引来得到数据)。
- all(对于前面的每一行,都通过全表扫描来得到数据)。
4.3 Extra:执行情况的说明和描述
- Using index(此值表示mysql将使用覆盖索引,以避免访问表)。
- Using where(mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引)。
- Using temporary(mysql 对查询结果排序时会使用临时表)。
- Using filesort(mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成)。
- Range checked for each record(index map: N) (没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的)。
边栏推荐
- 312. 戳气球
- 407-栈与队列(232.用栈实现队列、225. 用队列实现栈)
- MySQL(五) — 锁及事务
- Flannel 工作原理
- About professional attitude
- About SQL: is there a way to fill in the null value in the field without adding fields on the basis of the original fields
- Learning and using quartz scheduling framework
- 数据库原理实验测试题,关于图书分类表
- 301. 删除无效的括号
- JUnit unit test reports an error org junit. runners. model. InvalidTestClassError: Invalid test class ‘xxx‘ . No runnable meth
猜你喜欢
![[bull Chinese document] queue package used to process distributed jobs and messages in nodejs](/img/f9/1bd79d3754c1b4d1b114d02283f95e.png)
[bull Chinese document] queue package used to process distributed jobs and messages in nodejs

产品-Axure9(英文版),原型设计 制作下拉二级菜单

Analysis of personalized learning progress in maker Education

Advanced drawing skills of Excel lecture 100 (VIII) -excel drawing WiFi diagram
![[system] right click the desktop icon. After turning around, the Explorer will crash and the desktop will be refreshed](/img/aa/0189beb065fa0d4b625390793cb79b.png)
[system] right click the desktop icon. After turning around, the Explorer will crash and the desktop will be refreshed

EndNote20使用教程分享(未完

GINet

MySQL mvcc multi version concurrency control

Unet代码实现

MySQL redo log redo log
随机推荐
295. 数据流的中位数
pspnet完整代码实现
deeplab v3 代码结构图
313. 超级丑数
Analyzing the creation principle in maker Education
RFID数据安全性实验:C#可视化实现奇偶校验、CRC冗余校验、海明码校验
Deep learning series 47: Super sub model real esrgan
PSP code implementation
Why does TCP protocol shake hands three times instead of two?
[bull Chinese document] queue package used to process distributed jobs and messages in nodejs
20220621 Dual Quaternion
300. 最长递增子序列
In depth learning series 46: face image super score gfp-gan
MySQL Redo log Redo log
899. ordered queue
ldconfig 命令
20220620 uniformly completely observable (UCO)
901. 股票价格跨度
Why can't the index of JS array use negative numbers
406 double pointer (27. remove elements, 977. square of ordered array, 15. sum of three numbers, 18. sum of four numbers)