一篇文章带你读懂MySQL

作为一名开发人员来说,数据库知识是必不可少的,博主曾经年少无知的时候因为不了解数据库而被京东拒之门;无论是基于文件的Sqlite,还是工程上使用很多的MySQL、PostgreSQL/SQL Server;但是都没有对数据库有一个清晰的体系认识,所以拿出一段时间来研究数据库,希望对看到这篇文章的各位能有所帮助;

关于mysql数据库技术的外文文献_数据


MySQL是一个跨平台的开源关系型数据库,目前MySQL已经被广泛的运用到中小型的网站项目中去,由于其体积小,成本低,速度快这些特点,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。随着MySQL在互联网上被广泛使用,在数据库领域的地位爆炸式的提升,大量的使用MySQL作为公司业务的数据库;


MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。


数据库的定义

很多开发者对数据库的概念其实是比较模糊的,觉得数据库就是一些数据的集合,但是实际上却比这个复杂的多;数据库领域有两个比较容易混淆的概念,就是数据库和数据库实例;
1.数据库:物理操作文件系统和其它形式文件类型的集合;
2.数据库实例:MySQL数据库由一个后台线程和共享内存组成;

MySQL的组成

Information_schema:信息数据库,提供了访问时数据库元数据的方式。那么什么是元数据呢?元数据是一些关于数据的数据;即数据库的表名、列名、列的访问权限等;
MySQL:核心数据库,提供了一些MySQL的核心数据,负责存储数据库的用户和对应的权限问题;
Performance_schema:性能优化库,mysql 5.5 版本 新增了一个性能优化的引擎: PERFORMANCE_SCHEMA这个功能默认是关闭的:需要设置参数: performance_schema 才可以启动该功能,这个参数是静态参数,只能写在my.cnf 中 不能动态修改

数据库和实例

在实际使用中,数据库和实例往往是一一对应的,我们无法直接操作数据库,我们操作的都是数据库的实例,通过数据库实例来操作数据库的文件;可以理解为数据库为上层提供的一个数据库实例的接口,用来操作数据库文件系统;

关于mysql数据库技术的外文文献_关于mysql数据库技术的外文文献_02


在Unix下,mysql的一个实例启动会启动两个进程;mysqld就是真正的数据库服务守护进程;另个mysqld_safe进程则是负责检查和设置MySQLd启动的控制程序,它负责监控MySQLd进程的启动和执行,一旦mysqld进程出现错误,则有mysqld_safe进程尝试重新启动这个进程;

MySQL的架构

关于mysql数据库技术的外文文献_数据_03


最上层的用于连接,线程处理的并不是MySQL发明的,而是很多服务都有的类似的功能,负责创建连接池,连接数据库;

中间层包含了MySQL的大多数的核心业务,包括对sql的解析,分析和优化,数据库的存储过程,触发器和视图都是在这层来实现的;而第三层则是数据库真正的负责数据库的存储和提取的引擎;

数据的存储

这里是关于数据库的存储引擎的介绍

索引

索引可以说是数据库的秘密武器了,它是用来快速定位数据的重要武器,它对提升数据库的服务、改善数据库服务端的功能启动重大的作用;索引优化是对查询性能优化最有效的手段,它可以轻松将查询优化好几个数量级;
详情见文章MySQL的索引

我们都知道锁的种类分为乐观锁和悲观锁,InnoDB存储引擎中采用的是悲观锁;而按照锁的粒度来划分,锁分为行锁和表锁;
详情见文章MYSQL的锁

并发控制机制

乐观锁和悲观锁其实都是并发控制的机制,同时它们在原理上就有着本质的差别;

乐观锁是一种思想,它其实并不是一种真正的『锁』,它会先尝试对资源进行修改,在写回时判断资源是否进行了改变,如果没有发生改变就会写回,否则就会进行重试,在整个的执行过程中其实都没有对数据库进行加锁;

悲观锁就是一种真正的锁了,它会在获取资源前对资源进行加锁,确保同一时刻只有有限的线程能够访问该资源,其他想要尝试获取资源的操作都会进入等待状态,直到该线程完成了对资源的操作并且释放了锁后,其他线程才能重新操作资源;

虽然乐观锁和悲观锁在本质上并不是同一种东西,一个是一种思想,另一个是一种真正的锁,但是它们都是一种并发控制机制。

关于mysql数据库技术的外文文献_MySQL_04


乐观锁不会出现后台死锁的现象,但是由于更新后再验证数据,所以当冲突频率和重试成本较高的时候,更推荐使用悲观锁;当需要很高的反应速度和并发量很大的时候,这个时候推荐使用乐观锁,使用悲观锁的话会存在性能问题;

在选择并发控制机制时,需要综合考虑上面的四个方面(冲突频率、重试成本、响应速度和并发量)进行选择。

锁的种类

对数据的操作其实只有两种,也就是读和写,而数据库在实现锁时,也会对这两种操作使用不同的锁;InnoDB 实现了标准的行级锁,也就是共享锁(Shared Lock)和互斥锁(Exclusive Lock);共享锁和互斥锁的作用其实非常好理解:

共享锁(读锁):允许事务对一条行数据进行读取;
互斥锁(写锁):允许事务对一条行数据进行删除或更新;

而它们的名字也暗示着各自的另外一个特性,共享锁之间是兼容的,而互斥锁与其他任意锁都不兼容;
稍微对它们的使用进行思考就能想明白它们为什么要这么设计,因为共享锁代表了读操作、互斥锁代表了写操作,所以我们可以在数据库中并行读,但是只能串行写,只有这样才能保证不会发生线程竞争,实现线程安全。

锁的粒度

死锁的发生

既然 InnoDB 中实现的锁是悲观的,那么不同事务之间就可能会互相等待对方释放锁造成死锁,最终导致事务发生错误;想要在 MySQL 中制造死锁的问题其实非常容易:

关于mysql数据库技术的外文文献_MySQL_05


两个会话都持有一个锁,并且尝试获取对方的锁时就会发生死锁,不过 MySQL 也能在发生死锁时及时发现问题,并保证其中的一个事务能够正常工作,这对我们来说也是一个好消息。

事务与隔离级别(重点,面试常问)

事务,顾名思义,即指的是一个完整的事务流程,事务的ACID四个特性也是基础;
事务的隔离性是数据库处理数据的几大基础之一,而隔离级别其实就是提供给用户用于在性能和可靠性做出选择和权衡的配置项。
详情见文章MySQL的事务与隔离级别

总结

这篇文章的总体是将大家带进MySQL的世界,细节的问题大家可以去看我的每个对应的文章,哪里有遗漏的或者想了解的,欢迎大家留言;

关于mysql数据库技术的外文文献_关于mysql数据库技术的外文文献_06


/*************************************************************************

/*************************************************************************

此文章版权方是个人,目的是为自己记录学习历程的同时为大家提供一些参考;如果有不正确的地方,欢迎大家提出!

/*************************************************************************
/*************************************************************************