MySQL的基本语法

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

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

https://www.cnblogs.com/lbhym/category/1493919.html

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

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

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

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

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

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

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

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

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

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

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

Mysql索引的实现,B+树

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

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

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

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

https://blog.csdn.net/login_sonata/article/details/75268075

为什么会选择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会从左往右匹配,直到遇到>、<、between、like就会停止。

比如联合索引中有四个字段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行进行操作也会被阻塞。对于这种业务没必要设置为可串行化隔离级别。

深入了解MySQL,一篇简短的总结的更多相关文章

  1. 转摘 MySQL扫盲篇

    一下文章摘自:http://www.jellythink.com/archives/636 MySQL扫盲篇 2014-09-15 分类:MySQL / 数据库 阅读(1412) 评论(1)  为什么 ...

  2. Linux配置mysql (centos配置java环境 mysql配置篇 总结四)

    ♣安装的几种方法和比较 ♣配置yum源 ♣安装mysql ♣启动mysql ♣修改密码 ♣导入.sql文件 ♣缓存设置 ♣允许远程登录(navicat) ♣配置编码为utf8  1.关于Linux系统 ...

  3. 第二章 MySQL入门篇

    第一章 MySQL入门篇 一.MySql简介 简言: 和SQL Server数据库相同,MySQl也是一个关系型数据库管理系统.由瑞典的MySQL AB公司开发,2008年被SUN公司收购,2009年 ...

  4. mysql 架构篇系列 3 复制运行状态监控与选项参数说明

    一. 概述 在上一篇中,搭建了一主一从的复制架构,这篇通过一些诊断方法来了解复制的运行状态和一些选项参数说明.上次mysql主从服务关机,今天在打开mysql服务,出现了错误信息. 1.首先 启动主从 ...

  5. 【目录】mysql 架构篇系列

    随笔分类 - mysql 架构篇系列 mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制) 摘要: 一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在 ...

  6. 【目录】mysql 进阶篇系列

    随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...

  7. 【目录】mysql 基础篇系列

    随笔分类 - mysql 基础篇系列 mysql 开发基础系列22 SQL Model(带迁移事项) 摘要: 一.概述 与其它数据库不同,mysql 可以运行不同的sql model 下, sql m ...

  8. mysql注入篇

    博客这个东西真的很考验耐心,每写一篇笔记,都是在艰难的决定中施行的,毕竟谁都有懒惰的一面,就像这个,mysql注入篇,拖拖拖一直拖到现在才开始总结,因为这个实在是太多太杂了,细细的总结一篇太烧脑. 由 ...

  9. 最新MySQL入门篇

    一.SQL简介 ​ SQL:结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系 ...

  10. (6)MySQL进阶篇SQL优化(MyISAM表锁)

    1.MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源 (如 CPU.RAM.I/O 等)的抢占以外,数据也是一种供许多用户共享的资源.如何保证数 据并 ...

随机推荐

  1. bootstrapValidator JS修改内容无法验证

    需求: form表单输入中有坐标,坐标可以输入也可以从地图中获取,验证插件使用的是 bootstrapValidator 问题: 当输入错误的值时会触发验证,有错误提示.当在地图上选择坐标,通过js修 ...

  2. Docker系列-第七篇Docker构建SpringBoot应用

    1.基于Dockerfile构建SpringBoot镜像 1.1准备工作 将SpringBoot项目通过maven打成jar包 mvn clean package #使用maven打包项目 1.2使用 ...

  3. P1828 香甜的黄油 Sweet Butter 最短路 寻找一个点使得所有点到它的距离之和最小

    P1828 香甜的黄油 Sweet Butter 闲来无事 写了三种最短路(那个Floyed是不过的) 题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法:糖.把糖放在一片牧场上,他知道N(1 ...

  4. java main 方法

    public static void main(String[] args) { BigDecimal b1 = new BigDecimal(0.01000000); BigDecimal b2 = ...

  5. Typescript 实战 --- (7)类型兼容性

    ts 允许类型兼容的变量相互赋值,这个特性增加了语言的灵活性   当一个 类型Y 可以被赋值给另一个 类型X 时,就可以说类型X兼容类型Y.其中,X被称为“目标类型”,Y被称为“源类型” X兼容Y : ...

  6. jQuery, 文本框获得焦点后, placeholder提示文字消失

    文本框获得焦点后, 提示文字消失, 基于jQuery, 兼容性: html5 //所有文本框获得焦点后, 提示文字消失 $('body').on('focus', 'input[placeholder ...

  7. @RequestParam,@PathVariable,@RequestBody

    @RequestParam 和 @PathVariable 注解是用于从request中接收请求的,两个都可以接收参数,关键点不同的是@RequestParam 是从request里面拿取值,而 @P ...

  8. spring boot 集成apollo 快速指南

    目前市面上流行的三大配置中心框架:Spring CLoud Config .Alibaba Nacos 以及携程apollo, 我们相应架构组号召,就使用Apollo吧. Work Flow 简单解释 ...

  9. Elasticsearch 开箱指南

    内容概要 ES 基础介绍,重点是其中的核心概念. 基础 API 实践操作. 1. 基础介绍 Elasticsearch (ES) 是一个数据库,提供了分布式的.准实时搜索和分析. 基于 Apache ...

  10. HBase的安装、配置与实践

    本教程运行环境是在Ubuntu-64位系统下,HBase版本为hbase-1.1.2,这是目前已经发行的已经编译好的稳定的版本,带有src的文件是未编译的版本,这里我们只要下载bin版本hbase-1 ...