对mysql的总结与反思_深入了解MySQL,一篇简短的总结

MySQL的基本语法

这里作为MySQL部分模块的深入了解,大部分都是理论方面的笔记,不会写具体用法。

具体用法会记录在下面这个随笔分类下,不过暂时还没更新完,等过段时间会更新下事务、存储过程、索引等用法,虽然都很简单,就当做个完整的笔记。

一个关系型数据库的基本模块

以下模块也不一定是各大数据库实际的模块,但是都差不多,只是大概了解一下数据库的架构。

除了硬件,也就是存储部分,是由磁盘组成,在软件部分主要分为一下几个模块:

存储管理:用于管理数据格式,把物理数据通过逻辑的形式组织表现出来,即数据实际都是存在物理的磁盘当中,需要在软件层面做一个逻辑上的组织管理。

缓存机制:影响数据库性能的一大问题就是IO,所以会将取出来的数据放入内存当中,使用时直接从内存返回。即使目前非常快的固态硬盘也远远比不上内存的速度。

SQL解析:将SQL解析成机器可读的语言。

日志管理:记录用户对数据库的操作。

权限划分:字面意思,非常常见的一个功能,将不同的用户分为不同的角色,操作权限也不同。

容灾机制:这个部分较为复杂,大概作用就是当数据库发生异常灾难时该怎么恢复。

索引管理:优化数据库查询效率。

锁管理:使数据库支持并发操作。

Mysql索引的实现,B+树

索引是优化数据库查询效率,普通的查询是全表查询,当数据量过大时会严重影响性能。

而索引就像一本词典的目录,在数据量较大时会增加查询效率,但是如果频繁的更新或删除数据,同时也需要去维护索引,反而会降低性能,所以索引不宜太多。

索引实际上也是一个文件,既然需要高效的查找当然也需要一个好的数据结构,关于索引的实现,有B树、二叉查找树等,这里只讲MySQL的B+树。

B+树的特点和插入删除过程想过很多文字描述,但是总有点说不清。推荐看看这篇博客,过程图文表现的很清楚。

为什么会选择B+树?

B+树的一个特点就是其叶子结点均有一个链指针指向下一个叶子结点,再加上其是有序的,所以我们进行范围查询时,比如查询>10的数据,只需要先找到10,再直接通过叶子结点的指针就能找到其余数据。

而其他结构还需从根节点出发接着找。

联合索引最左匹配原则

联合索引,有的叫组合索引、有的叫复合索引,叫法无所谓,大概是那个意思就行。

1.一张表里有字段A、B,当我们需要查询where A=‘xxx’ and B='xxx',在这种场景下我们就可以使用联合索引。

而最左匹配原则就是,当创建索引时,语句如下

alter table TABLENAME add index index_name(A,B)

其中A在左边,那么如果我们只查询A时,会用到这个联合索引,而只查询B时,不会用到这个联合索引。

2.还有种情况,在联合索引中,mysql会从左往右匹配,直到遇到>、

比如联合索引中有四个字段A,B,C,D。where A=1 and B=2 and C>3 and D=4。其中ABC会用到索引,而D不会。如果在定义索引时交换C,D的位置,ABCD就都会使用索引

alter table TABLENAME add index index_name(A,B,C,D)-->alter table TABLENAME add index index_name(A,B,D,C)

所以最左匹配原则是依据定义索引时的顺序,查询时顺序如何不影响(因为mysql查询优化器会帮我们优化查询顺序)。

最左匹配原则的原理

索引的底层是B+树,联合索引也一样。但是联合索引特殊的就是有多个值,而构建B+树只需一个值,mysql选择最左的那一个字段当值。

上图是一个联合索引下的B+树,假如字段分别对应(A,B),可以发现A的值是有序的(1,1,2,2,3,3),B是无序的(1,2,1,4,1,2),所以当我们直接查找B=2时是无法通过索引找的。

因为这个B+树是按A的值形成的,B的值完全不符合B+树特性,所以无法单独找到B。

那为先找到A后,就能找到B了?

大家仔细观察这个树,在A相等的区间内,B是有序的。

还有就是,为什么遇到范围查询就停止了。范围查询是针对全表的,而非最左的字段只是区间内有序。

MySQL两种引擎:MyISAM和InnoDB

简短地说

Myisam:是非聚集索引,不支持事务,只支持表级锁。

InnoDB:是聚集索引,支持事务,默认是行级锁,支持表级锁。

下面就这三个方面一一说明。

聚集索引

定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。即索引键值的逻辑顺序决定了表中相应行的物理顺序。

网上有个很好的例子,就是把聚集索引比作一本字典的拼音目录。而数据就是字典里面的字。拼音目录是按照一定顺序排列的,那么字典后面的字也一定是根据拼音的顺序排列的。

当我们在拼音B处插入一个新汉字,那么B后面所有的汉字要向后移动,不可能是加在字典最后面的,因为它得按拼音顺序排列。

所以聚集索引适用于:范围查询,比如,=,between等,还有分组group by,因为B+树是有序的,所以分组的效率也更高。

不适用于:频繁更改的列。

非聚集索引

定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

即索引在一个地方,数据在一个地方,索引带有指向数据的指针。这在物理上也体现出来了,在数据库目录下,索引存在.MYI文件下,数据存在.MYD文件下。上面的聚集索引,数据和索引在同一个文件下.ibd。

而数据的顺序和索引不一样,所以聚集索引适用于:频繁修改索引列。

表级锁和行级锁

两种锁即字面意思。表级锁,mysql中最大粒度得到锁,锁住整张数据表。行级锁,mysql中最小粒度的锁,只锁住操作的那一行,本表中其他行不锁。

而针对不同的操作,锁的具体类别又有所不同,为了不混淆,大家可以把表级锁和行级锁当作锁的范围。而下面说到的锁当作具体的分类。

当Myisam查询时:会在整张表的范围上加上读锁,又叫共享锁。当加上读锁,其他sql的想增删改时就会被阻塞,必须等待查询完毕。又叫共享锁的原因是,可以同时在同一张表内做查询。

当Myisam增删改时:会在整张表的范围上加上写锁,又叫排他锁。当加上写锁,其他sql不论是增删改还是查询都会被阻塞。又叫排他锁的原因是,即使我修改的是1-10行数据,你查询第11行数据也会被阻塞。

上面说的是MyISAM引擎的情况,InnoDB在读锁、写锁上的逻辑也是一样的,只是锁范围变成了行。

大家在mysql上实验InnoDB的锁时:要注意,InnoDB对select进行了优化,并未对select语句加上读锁,也就是非阻塞select,大家可以在select语句后面加上lock in share mode手动加上读锁。

具体怎么实验:1.往表中插入几百万条的数据,增删改查时在范围内进行,这样就可以模拟阻塞环境了。2.InnoDB支持事务,不过其是自动提交的,还得用set autocommit=0取消自动提交。这样在commit之前就是阻塞状态。

事务

简单的说,就是使多步操作具有原子性。即在事务内执行多条SQL语句,要么全部成功,要么全部不成功,不会存在部分执行成功,而导致数据不一致的情况。

事务具有四大特性:

原子性,上面说到的。

一致性,事务前后数据的完整性必须保持一致。

隔离性,多个用户事务并发进行时,不能互相干扰。

持久性,一旦事务提供,其修改的结果是永久存在的。

重点说说隔离性。如果事务间没有隔离会发生什么情况呢。

假如有一个场景:事务A获取到一个数据为900,此时另外一个事务B在事务A提交之前就修改了数据到800,并提示成功。

而事务A的操作数据依旧是查询时的900,并进行+100,变成了1000。显然结果是不对的,这就是更新丢失问题。

这个问题是不是很像多线程并发操作,但是没有锁时就会发生的问题。实际上,事务的隔离就是用锁来实现的。

了解隔离级别之前需要知道几个概念:

脏读:事务A读取到了事务B还未提交的数据。

不可重复读:事务A多次查询数据时,事务B对该数据做了修改并提交,此时事务A发现多次查询前后结果不一样。

在我们看来仿佛没什么问题,一个事务修改了数据,一个事务查询到了修改后的结果。但有个问题就是,事务A是多次查询,如果他没有多次查询,直接在第一次查询的结果上操作,那么是不是就会出现问题。

幻读:事务A查询了一段数据集,事务B修改了事务A的数据集范围内的某些数据,导致查询结果和实际结果不一致。

了解了这三个概念后就可以很好的理解几个隔离级别:

隔离级别

脏读

不可重复读

幻读

未提交读(Read uncommitted)

可能

可能

可能

已提交读(Reda committed)

不可能

可能

可能

可重复读(Repeatable read)

不可能

不可能

可能

可串行化(Serializable)

不可能

不可能

不可能

隔离级别越高,安全性越高,性能也越低,所以要根据实际业务设置不同的隔离级别。

举个例子:如果设置的是可串行化隔离级别,事务A对TableA的1-10行进行操作,事务B即使对TableA的第11行进行操作也会被阻塞。对于这种业务没必要设置为可串行化隔离级别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HH SaaS电商系统移动端商城,买家选择商品规格的交互设计

文章目录未完整选择商品规格时商品图如何显示库存如何显示价格如何显示选择规格提示文案如何显示原型图已选完整选择商品规格时商品图如何显示库存如何显示价格如何显示原型图SKU下架后如何显示原型图购买数量如何交互未完整选择商品规格时 商品图如何显示 显示SPU的主图&…

aws lambda_适用于无服务器Java开发人员的AWS Lambda:它为您提供了什么?

aws lambda无服务器计算如何帮助您的生产基础架构? 在过去的几年中,无服务器计算架构一直受到关注,因为它专注于应用程序的主要组件之一:服务器。 这种体系结构采用了不同的方法。 在下面的文章中,我们将解释无服务器…

HH SaaS电商系统的销售订单毛利润模块设计

HH SaaS电商系统的销售订单利润分析,仅是简单分析供运营人员参考而已,所以订单生成后就自动根据商品成本价和实际交易价生成利润表,而不需要等到订单归档后才生成。 销售子单的毛利润最终交易总额-成本总额销售子单的毛利率毛利润/最终交易总…

aes子密钥生成c语言_一种基于流密码算法的子密钥生成方法与流程

本发明涉及一种用于分组加解密算法的子密钥的生成方法。背景技术:随着信息技术的发展,信息安全性的问题却愈来愈显得突出,保证信息安全的一个重要技术就是密码学。密码学在信息安全技术中扮演着基础的角色,是攻击者最难攻破的模块…

学习java很痛苦_Java日期细微的痛苦提醒

学习java很痛苦这些天我不再需要使用java.util.Date了,但是最近选择这样做,这让我想起了使用与Java Date关联的API的痛苦 。 在这篇文章中,我看了弃用的参数化Date构造函数的一些令人惊讶的API期望,该构造函数接受六个整数 。 在…

如何理解程序保存数据就是输出,读取数据就是输入的含义(程序中输入input/输出output的含义如何理解)

文章目录程序是如何保存数据的为什么保存数据的类名称都表达一种输出意思,例如:output程序如何读取数据为什么读取数据的类名称都表达一种输入意思,例如:input总结程序是如何保存数据的 对象的序列化就是持久化,就是把…

hazelcast_HazelCast的Spring-Boot和Cache抽象

hazelcast以前,我们是使用spring提供的默认Cache Manager来开始Spring Cache抽象的。 尽管这种方法可能适合我们对简单应用程序的需求,但是在出现复杂问题的情况下,我们需要使用具有更多功能的其他工具。 Hazelcast就是其中之一。 当涉及到基…

eclipse preference没有server_Java Web开发的前期准备工作,部署Tomcat服务器和Server环境创建...

Java Web: 顾名思义,就是用Java的方式来解决Web开发,我也不讲太多的理论问题,直接将如何上手来进行Java Web开发。那么,我们一般进行Java Web开发,可以使用的工具很多,我这里使用eclipse。选择eclipse的版本…

类似TH养车的电商系统设计思路

平台运营模式B2CO2O,汽车用品全部平台自营,允许线下汽车服务门店入驻,门店运营模式O2O汽车服务全部标准化,由平台创建和维护服务商品根据商品实际使用需要关联服务商品线下汽车服务门店根据自己实际运营的情况选择有能力提供的汽车…

java int不将0忽略_Java微服务:蛋糕是骗人的,但您不能忽略它

java int不将0忽略构建微服务实际上意味着什么? 通过微服务框架的眼光回答 忽略微服务的趋势已变得不可能。 有些人会说这只是另一个难以忍受的流行语,而另一些人会背诵打破巨石的优势或采取逆势方法并关注负面因素。 在本文中,我们将全面了…

4怎么放大字体_Word字体怎么放大?简单教你几招轻松搞定

一般情况下我们都会选择用Word编辑文章。文章编辑完成之后我们通常会对文章进行排版。在排版的过程中如果我们需要将Word字体放大该怎么办呢?下面我就来教大家几个Word字体放大的小技巧,一起来看看吧。下面以放大“字体演示”为例为大家演示操作过程。一…

js splice坑_JavaScript的splice()方法在for循环中使用可能会遇到的坑!!!

在我们日常敲代码的时候,常常会用到splice()方法来删除数组中的元素(就是以截取的方式),因为它会直接对数组进行修改。在使用splice之前,必备条件是,要先有一个数组。var arr new Array(1,2,3,4,5); // 初始化一个数组var delete…

java crud_Java 8流中的数据库CRUD操作

java crud在开始使用新工具时要克服的最大障碍是让您着手处理小事情。 到目前为止,您可能对新的Java 8 Stream API的工作方式充满信心,但是您可能尚未将其用于数据库查询。 为了帮助您开始使用Stream API创建,修改和读取SQL数据库&#xff0c…

HH SaaS电商系统的线下服务商品库存和采购设计

线下服务商品库存和采购整体思路 线下服务商品直接在商品编辑页面编辑库存数量即可,服务端直接修改服务商品的销售库存即可线下服务商品则不必生成采购单和出库单线下服务商品无需发货,但是需要商家核销服务权益

HH SaaS电商系统的仓储系统设计

如果商城或者店铺选择开通了供应系统,那么就必然有仓储系统,如果选择不开通供应系统,可以独立开通仓储系统 未开通仓储系统 商城和店铺如果不需要仓储系统,那么商城和店铺就不会有仓储模块,所以无法手动创建库存单据…

wps如何将字体竖着排列_WPS文字中怎么竖着打字?wps文字竖排的设置方法介绍

wps中怎么样才能让文字竖着写啊?WPS现在的应用比较多,其实WPS文字和Word相差不过,都是一个办公软件,我们有时候在编辑的时候需要把文字竖排,那么,wps文字怎么竖排呢?接下来脚本之家小编就给大家…

cloudfoundry_在Cloudfoundry上部署RESTful服务

cloudfoundry在本文中,我们将使用Pivotal Cloud Foundry(PCF)开发人员在Cloudfoundry上部署RESTful服务。 由于创建静态Web服务不是本文的一部分,因此我已经创建了employee-service ,它具有静态后端,可以从…

HH SaaS电商系统的线上服务商品库存和采购设计

文章目录线上服务商品库存和采购整体思路线上服务商品的采购单状态线上服务商品的出库单状态商家完成服务线上服务商品库存和采购整体思路 线上服务商品直接在商品编辑页面编辑库存数量即可,服务端自动生成类型为“调整入库”的入库单和类型为“调整出库”的出库单…

arm linux gif 显示_100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色

最近在研究基于imx6ull开发板,想让开发板支持显示图片、字符串、背景色的功能。 操作的主要步骤如下:移植设备树和驱动移植libjpeg库编写测试程序一、移植设备树和驱动开发板原厂SDK已经移植了lcd对应的设备树和驱动。具体可以参考韦东山老师的文章https…

动态代码生成 静态代码生成_将速度提升到自己的个人代码生成器中

动态代码生成 静态代码生成Speedment是一个开源工具包 ,可用于生成Java实体和管理器以与数据库进行通信。 如果您需要域模型的对象关系映射,那么这很好,但是在某些情况下,您可能希望使用数据库作为模板来生成完全不同的东西。 在本…