目录
一.学习教程资源
菜鸟教程:用于初学者初步了解mysql https://www.runoob.com/mysql/mysql-tutorial.html
SQL语句编写测试:https://www.w3school.com.cn/sql/index.asp
GitHub上mysql项目:https://github.com/jaywcjlove/mysql-tutorial
中国地区省级区级数据表:https://github.com/kakuilan/china_area_mysql
二.介绍MYSQL
1)肾么事mysql
mysql是目前最流行的关系型数据库管理系统,开源,免费,是目前最好的RDBMS(关系型数据库管理系统)
-
MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
-
MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。
我们也可以将数据存储在文件中,但是在文件中读写数据速度相对较慢。
所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:
-
1.数据以表格的形式出现
-
2.每行为各种记录名称
-
3.每列为记录名称所对应的数据域
-
4.许多的行和列组成一张表单
-
5.若干的表单组成database
2)RDBMS基本术语
-
数据库: 数据库是一些关联表的集合。
-
数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
-
列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
-
行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
-
冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
-
主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
-
外键:外键用于关联两个表。
-
复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
-
索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。
-
参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
mysql的架构分析
-
过程一:客户端连接连接器,一般我们使用客户端连接mysql的时候,就是由连接器接收和验证的,使用TCP连接,连接成功后,处于空闲状态,客户端超过8个小时没有响应,就会自动断开连接。
我们可以自动设设置连接数据库的超时时间,但是使用mysql的时候,临时使用的内存是由连接对象管理的,长时间得不到释放,会导致OOM(Out Of Memory),会导致mysql重启,JVM中频繁Full GC;因此需要执行一个较大的查询时候,使用mysl_reset_connection初始化连接资源或者设置定期重连。
过程二:查询缓存。在mysql8.0之前默认使用缓存,当通过一条查询语句第二次查询时候,优先从缓存中获取,采用K,v的形式存储,sql语句和查询结果,但是每当表出现更新操作的时候,会清空所有的缓存,这就是8.0之后被弃用的原因,很少 有表只用来查询而没有其他操作的。也可以自己设置是否使用缓存,把query_cache_type设置成为DEMAND,这样SQL默认不适⽤缓存,想⽤缓存就⽤SQL_CACHE。
过程三:从缓存中未查询到数据,则会对SQL语句进行分析,判断有没有语法错误,语句中的单词属于表名还是列名
过程四:优化器,优化主要是判断使用哪个索引,执行顺序
过程五:执行器,包括判断查询的权限,逐行判断数据是否满足查询条件。
三.MYSQL存储引擎介绍
使用show engines;
默认存储引擎是InnoDB ,在mysql5.5之后,默认使用InnoDB,mysql5.5之前使用MyIasm,支持的所有引擎,只有InnodDB是支持事务的
查询默认存储 引擎
查询表的明细信息:
1).MyISAM和InnoDB的区别
MYISAM是5.5之前默认的存储引擎,支持全文索引,压缩,空间函数,但是不支持事务和行级锁,最大却显示崩溃后无法安全恢复。
对比:
1.是否支持行级锁:MyISAM只有表级锁,InnoDB支持表级锁和行级锁,默认是行级锁
2.是否支持事务和崩溃后的安全恢复:MyISAM强调性能,每次查询具有原子性,执行速度更快,但是不提供事务支持,InnoDB支持外键和事务等高级数据库功能,支持回滚,崩溃后的修复,和事务
3.是否支持外键:MyISAM就不支持,InnoDB支持
4.是否支持MVCC:仅InnoDB支持,MVCC用于高并发事务,比加锁更加高效,MVCC只在READ COMMITTED 和 REEPEATABLE READ两个隔离级别下工作,内部使用乐观锁和悲观锁来实现
(在InnoDB使用聚簇索引或者访问数据放入内存的应用中,执行效率比MyISAM更快)
四.索引
mysql索引使用的数据结构主要有BTree索引和哈希索引,哈希索引底层数据结构是哈希表,对于单条记录查询的时候可以选择哈希索引,查询性能最快,其余场景,更适合使用B-Tree索引
mysq中使用的是B+Tree索引,但是对于MyISAM和InnoDB实现的方式不同
事务的四大特性
原子性:事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么完全不起作用
一致性:执行事务前后,数据保持一致,多个事务对同一数据读取的结果是相同的
隔离性:并发访问数据库的时候,一个用户的事务不被其他事务所干扰,并发事务处理之间数据库独立
持久性:一个事务被提交以后,他对数据库中数据的改变是持久的
并发事务带来的问题
脏读: 如果⼀个事务读到了另⼀个未提交事务修改过的数据。
不可重复读:如果⼀个事务只能读到另⼀个已经提交的事务修改过的数 据,并且其他事务每对该数据进⾏⼀次修改并提交后,该事务都能查询得到最新值。
幻读::如果⼀个事务先根据某些条件查询出⼀些记录,之后另⼀个事务⼜向表中 插⼊了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另⼀个事务插⼊的记录也读出来。
四种隔离界别是:读未提交,读已提交,可重复读,串行化四种
这里InnoDB默认是可重复读,但是使用的Next-Key Lock锁算法,所以可以避免幻读
锁机制和InnoDB锁算法
MyISAM采用表级锁,InnoDB支持行级锁和表级锁,默认使用行级锁
为什么要使用B+树呢?
首先我们知道在数据库中索引可以使用hash算法,查询效率很高,但是不支持范围查询,因此我们考虑使用平衡二叉树,但是我们知道二叉树每个节点只有一个数据,如果数据变多的话,树就会越来越高,查询的成本也会增高,我们考虑使用B树,它可以在一个节点存储多个数据,B+树的优化是非叶子节点的数据会冗余一份在叶子节点,并且叶子节点之间使用指针相连,因此增高查询效率,而且支持范围查询,B+树里的元素也是有序的。