看完这一篇,别在说你学过MySQL了(四)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 大家好,我是Leo。目前在常州从事Java后端开发的工作。这篇是MySQL学习整理系列的第二篇。这个系列会与字节,网易,阿里,腾讯,美团,快手的相关朋友一起整理输出。希望帮助更多的朋友早日入大厂!

7. 存储引擎


7.1 innodb与myisam索引区别

  • MyISAM 是非事务的存储引擎,适合用于频繁查询的应用。表锁,不会出现死锁,适合小数据,小并发。
  • innodb是支持事务的存储引擎,合于插入和更新操作比较多的应用,设计合理的话是行锁(最大区别就在锁的级别上),适合大数据,大并发。

7.2 为什么采用innodb为默认索引

  • innodb支持事务
  • innodb比myisam支持更大的锁粒度,支持并发


8. 索引失效


  • like查询以 % 开头
  • <>
  • OR语句前后没有同时使用索引
  • 数据类型出现隐式转换
  • 使用is null函数时,不能利用索引,只能全表扫描。(其他函数也要注意)
  • SQL中有or,也会失效

注意varchar就必须加单引号,如果不加就会误认为int类型,虽然查询效果是一致的。但是索引失效了,增加了查询性能,也多消耗了磁盘IO的开销。


9. 事务

9.1 是什么

什么是事务呢?事务就是银行的需求一样,如果在执行过程中断电或者不符合条件的情况被停止执行,则已经执行的sql语句全部回滚。也就是说 事务操作过程要不全部成功,要不全部失败!事务ACID的特性可以确保银行不会弄丢你的钱

9.2 ACID

  • 原子性:要不全部成功,要不全部失败,不可能只执行其中一部分操作,这就是事务的原子性
  • 一致性:一致性主要体现在数据一致性,事务最终没有提交,事务所修改的数据不会保存在数据库中
  • 隔离性:当前事务执行的修改在最终提交之前,对其他事务是不可见的。
  • 持久性:一旦事务提交,将修改的数据持久化到数据库中就算数据库断电崩溃也不会丢失。

9.3 MVCC实现原理

MVCC是多版本并发控制。通过保存数据在某一个时间点的快照来实现的。也就是说不管需要执行多长时间。每次事务执行的数据都是一致的。相反! 根据事务开始时间的不同选择的快照也是不同的,所以每个事务对同一张表,同一个时刻看到的数据有可能是不一样的。(如果没有这一方面的概念听起来可能有点迷惑)

多版本并发控制实现的不同,典型的实现有乐观锁并发控制与悲观锁并发控制。

MVCC通过每行记录后面保存两个隐藏的列来实现的,一个是保存行的创建时间,一个是保存行的过期时间。存储的不是时间值,而是系统的版本号。每开始一个新的事务,系统版本号会自动增加。事务开始时刻的系统版本号也就是事务的版本号,用来查询到每行记录的版本号进行对比。

优点:保存这两个额外的系统版本号的好处就是 操作数据的时候不需要单独上锁,这样设计使得数据操作很简单,性能也很好。并且也能保证只会读取到符合标准的行。 缺点:每行记录都需要额外的存储空间,需要做更多的检查行的操作,以及额外的维护工作

MVCC只在repertable read(可重复读)和read committed(提交读)两种隔离级别下工作。其他两种隔离级别都和mvcc不兼容!

Tip:read uncommitted总是读取最新的数据行,而不符合当前事务版本的数据行。serializable则会对所有读取的行都加锁

9.4 事务隔离级别

通过set transaction isolationlevel //设置隔离级别,设置隔离级别会在下一个事务开始的时候生效

  • read uncommitted(未提交读) :事务中的修改即使没有提交对其他事务都是可见的,也可以称为脏读,这个级别会导致很多问题,从性能上来说不会比其他隔离级别好太多,但缺乏其他隔离级别的很多好处。除非真的有特定的需求,一般很少用
  • reda committed(提交读) :大多数数据库默认的都是read committed,但是MySQL默认的不是这个!一个事务从执行到提交前,其他事务都是不可见的,有时候也可以叫不可重复读,因为两次执行同样的查询可能会得到不一样的查询结果
  • repeatable read(可重复读) :repeatable read解决了read committed脏读的问题,这个隔离级别也是MySQL默认的隔离级别。该级别保证了同一个事务多次执行可以读取同样的数据,但是有个缺陷就是存在幻读!幻读就是当事务在某个范围内读取数据时,这时另一个事务在这个范围插入了数据,当读取的事务再次读取该范围时会产生幻行。通过多版本并发控制(MVCC)解决了幻读的问题。
  • serializable(可串行化) :这是最高的隔离级别,它通过强制事务在从串行上执行,避免了前面说的幻读问题,简单来说就在在读取数据时加一个锁,这就暴露了另一个问题,大量的加锁会导致出现争锁超时的问题。只有特定的需求情况下或者可以接收没有并发的情况下才考虑这种隔离级别。
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
关系型数据库 MySQL 数据库
MySQL基本知识点
本章主要讲解了MySQL的基础知识,比如事务特性、事务隔离级别
90 1
|
1月前
|
存储 Oracle 关系型数据库
[MySQL]知识点
本篇文章是关于MySQL各类知识点的小结,包括:int族数据类型存储数据范围、char族数据类型的选择问题等。 如果文中阐述不全或不对的,多多交流。
65 0
[MySQL]知识点
|
10月前
|
存储 Oracle 关系型数据库
MYSQL知识点
MYSQL知识点
|
10月前
|
关系型数据库 MySQL
MySQL练习题
MySQL练习题
64 0
|
关系型数据库 MySQL
【MySQL】基础知识
【MySQL】基础知识
|
关系型数据库 MySQL
MySQL 函数详解 - 小白必看(三)
在MySQL中,聚合函数主要由:count,sum,min,max,avg,这些聚合函数我们之前都学过,不再重复。这里我们学习另外一个函数:**group_concat()**,该函数用户实现行的合并。
124 0
MySQL 函数详解 - 小白必看(三)
|
SQL 存储 前端开发
MySQL知识点总结
MySQL知识点总结
143 0
MySQL知识点总结
|
SQL 存储 算法
mysql常见知识点
在mysql的学习中,将一些常用的知识点写出来,句句皆干货
116 0
|
存储 SQL 关系型数据库
MySQL部分知识点总结
MySQL部分知识点总结,索引、事务、锁以及优化等
145 0
MySQL部分知识点总结
|
存储 SQL 缓存
看完这一篇,别在说你学过MySQL了
大家好,我是Leo。目前在常州从事Java后端开发的工作。这篇是MySQL学习整理系列的第一篇。这个系列会与字节,网易,阿里,腾讯,美团,快手的相关朋友一起整理输出。希望帮助更多的朋友早日入大厂!
看完这一篇,别在说你学过MySQL了