1-MySQL - 扯淡篇

前言

观今宜鉴古,无古不成今
要了解一数据库的现在及将来,要首先了解数据库的过去.......
我们记录信息大致经历了以下几个历史.......

数据库的发展史

无库时代——文件系统

无论是通过石头、龟壳、羊皮卷、竹签记录信息的能力及其有限。当纸张出现后,虽然得到改善,但无法适应时代的发展。因为随着计算机的大范围应用,信息的产生、操作、共享、传输都呈现爆发式增长。这个时候,人们大多将数据信息保存到文件中。通过操作文件的形式,来处理数据信息。

层状数据库

层状数据库
顾名思义,层次状数据库使用树形结构表示实体间的关系,层次清晰,但是对于复杂的数据结构模型,树形深度比较大,较深结构会使数据形成冗余。

网状数据库

网状结构数据库
网状结构数据库将数据库管理向前迈了一步,网状结构能够表示数据之间的联系,但是这也带了另一个问题,实体之间往往关系复杂且有相互纠缠,随着网越大,这种弊端越发凸显。

关系型数据库

层状数据库和网状数据库欢快的使用着,直到——关系型数据库的出现。
虽然层状和网状结构解决了数据集中和数据共享的问题,但在数据独立性和抽象方面仍有很大的欠缺,直到1970年埃德加·科特提出了关系模型的概念,关系模型从此横行江湖。
关系模型将数据放在一种二维的存储结构中,整个数据库由若干个相互关联的二维表组成。关系型数据库解决了数据冗余问题,操作更加简化。

其他类型的数据库

  • 面向对象模型
  • 半结构化模型
  • 平面模型

数据库的分类

数据库的分类

为什么选择MySQL

数据库排行榜

DB-Engines排名根据其受欢迎程度对数据库管理系统进行排名。排名每月更新一次。

上图截取自2019.6.6号。

开源

开源就意味着免费!在中国,免费意味着什么?还用我多说吗?
当然,自从MySQL被Oracle收购后,就不太好了,但是我们还有mariaDB。

GPL

MySQL遵循GPL协议。什么是GPL?GNU通用公共许可协议(GNU General Public License,简称 GNU GPL、GPL),是广泛使用的免费软件许可证,可以保证终端用户能自由运行,学习,共享和修改软件。
要知道一款通用的商业软件,包括数据库软件,是为大多数应用场景设计的,但并不适合一些特定的应用场景下。那么有实力的公司,就可以在这个软件的基础上,实现高度的可自定制,以满足特定的应用场景。比如,阿里巴巴、华为、小米等这些有实力,业务范围广泛的公司。

健壮的社区

这是一个要命的话题!MySQL有着健壮的社区,有专门的人员在维护这个社区。
一个资源丰富的社区,是一个软件成功的关键,这点从Python就可以看出来,Python的社区做的可以说是非常的好,大家可以在这个社区找到自己想要的东西,碰到问题能很快的找到解决办法,有了新的见解,也愿意写成博客之类的供大家参考,良性发展下,Python也越发展越好,这个道理同样适用于各个软件,包括MySQL,MySQL在世界范围内有着庞大的用户群,这些用户都在为MySQL的发展提供了直接或间接的力量。

稳定

没错,对于一个公司,尤其是互联网公司而言,开发出来的软件稳定肯定是要放在第一位的。更何况重中之重的数据库。MySQL经过几十年的发展,已经越来越稳定,极少出现宕机情况。

高并发

当互联网深入到平常百姓家,谁都可以看了新闻,买个套套,那么应对这越来越多的瞬时对数据库处理操作,如果数据库不能处理高并发,那么面临就是淘汰!

跨平台

MySQL支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统

丰富的API接口

不管你数据库再厉害,那也是要搭配编程语言来实现具体的功能,丰富的API接口意味着有更多的编程语言可以与MySQL无缝协作,完成高效的开发。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等

支持标准的SQL语句

世界范围内,有那么多的数据库软件,你有你的一套操作规则,他有他的一套操作规则,那么,一个公司在选择一个数据库,还要专门的学习这门数据库的相关规则,查询语法什么的,这就增了生产成本。为了解决这个问题,在1970年的埃德加·科德的一篇相当有影响力的论文中《一个对于大型共享型数据库的关系模型》描述了SQL这个结构化查询语言,主要应用与数据库的管理。后来这玩意儿成了数据库语言的标准。MySQL使用这种标准的SQL语言。

多种存储引擎

是的,MySQL有不同的引擎来支持不同的应用场景。

用的人多

强者恒强,MySQL就是这样的一个存在,用MySQL的公司多了,你会MySQL就是加分项啊。

MySQL的模糊历史

MySQL的发展历程

让我们牢记一个人:天才少年蒙提
MySQL的历史最早可以追溯到1979年,那时候,蒙提用BASIC设计了一个报表工具,没过多久,就用C语言重写了该工具,移植到了Unix平台,在当时,他只是一个很底层的面向报表的存储引擎,这个工具叫做Unireg。

  • 1985年,他与Allan Larsson一起创办了TCX DataKonsult AB(一家瑞典数据仓库公司)。
  • 1990年,在最初,他们只是自己设计了一个利用索引顺序取数据的方法,也就是ISAM(Indexed Sequential Access Method)存储引擎核心算法的前身,利用ISAM结合mSQL来实现需求。早期的时候,该公司主要为瑞典的一些大型零售商提供数据仓库服务,但是随着数据量增大、系统复杂度越来越高,ISAM和mSQL的组合逐渐不堪重负。在分析性能的瓶颈后,问题出现在mSQL上,后来他们抛弃了mSQL,重新开发一套功能类似的数据存储引擎,这就是ISAM存储引擎。
  • 1995年,蒙提使用David Axmark编写第一版MySQL数据库,于1996年发布。需要说明的蒙提和David Axmark及Allan Larsson在同年创立了MySQL AB公司。
  • 1996年,MySQL的1.0版本发布,当时真是面向一部分人,直到同年的10月,MySQL的3.11.1发布!是的,这群不按套路的天才们,直接跳过了2.x版本!最开始,只是提供了Solaris下的二进制版本。一个月后,有了Linux版本。
    在接下来的两年里,MySQL不断的移植到各个平台下。
  • 1999年至2000年,MySQL AB与Sleepycat合作开发Berkeley DB引擎,因为该引擎支持事物处理。
  • 2000年,MySQL对旧的存储引擎进行了整理,命名为MyISAM。
  • 2001年,Innobase公司与MySQL AB达成合作,共同开发InnoDB引擎,该引擎同样支持事物,并且支持行级锁。同年MySQL发布MySQL4.0版本,该版本正式支持InnoDB引擎。
  • 2005年,MySQL发布了经典的5.0版本,MySQL在该版本中加入了游标、触发器、存储过程、视图等功能。同年,Oracle公司以迅雷不及掩耳之势收购了innobase公司。
  • 2008年,Sun公司以10亿美金收购了MySQL AB公司。
  • 2010年,可惜,Sun公司好景不长,因为2010年,Oracle公司又收购了Sun公司。从此,MySQL归Oracle所有。Oracle公司对MySQL分为社区版和企业版,社区版免费,企业版收费,当然,也提供更多的功能!同年4月22日MySQL5.5和MySQL Cluster7.1版本发布。
  • 2013年,2013年2月6日MySQL5.6发布,InnoDB性能和复制一致性加强。
  • 2014年,2014年4月4日Oracle发布MySQL里程碑式的版本MySQL5.7版本,此版本满足网络、云和嵌入式需求,性能更强、扩展性和可靠性得到提高。
  • 2016年,2016年9月12日,Oracle正式发布MySQL8.0版本。没错,直接跳过了6.x、7.x版本。

sakila

我们都知道MySQL的logo是海豚(sakila),而sakila的由来则是来自MySQL AB公司创始人从“海豚命名”竞赛中得来的,这个sakila是来自于坦桑尼亚的Arusha的一个小镇的名字。
sakila,图片来自互联网

目前主流的MySQL版本及分支

目前较为主流的MySQL版本:

  • 5.6
  • 5.7
  • 8.0

其他版本:

  • Oracle:
    - MySQL官方版
  • 红帽:
    - MariaDB
  • Percona:
    - PerconaDB

建议版本选择:

  • Oracle的官方版本,5.6和5.7,而5.7一般选择5.7.20
  • GA(稳定发布)

如何获取MySQL:

  • 企业版Enterprise,互联网行业一般不选择
  • 社区版,推荐
  • 源码包,通用二进制

MySQL相关概念

连接

MySQL提供了两种连接方式:

  1. TCP/IP方式(本地、远程):
mysql -uroot -p123 -h 10.0.0.1 -P330
  1. Socket方式(仅本地):
mysql -uroot -p123 -S /tmp/mysql.sock

当我们本地连接MySQL的时候,默认用的是socket方式,一般在配置文件中有体现:

[root@cs /]# cat /etc/my.cnf
[mysqld]
user=mysql
basedir=/opt/mysql
datadir=/data/mysql
server_id=6
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=3306 [\\d]>

如上socket指向的/tmp/mysql.sock文件就是socket文件,通过这个文件进行连接;我们也能在本地找到这个文件:

[root@cs /]# ll /tmp/mysql.sock
srwxrwxrwx 1 mysql mysql 0 8月  14 16:28 /tmp/mysql.sock

实例

MySQL实例由以下几部分组成:

  • MySQL后台守护进程
  • Master Thread
  • Work Thread
  • 预分配的内存

一台物理机上,通常可以部署一个实例;当然为了最大化的利用硬件性能,也可以部署多个实例。

MySQL架构

MySQL架构总共四层:

  • 首先,最上层的服务并不是MySQL独有的,大多数给予网络的客户端/服务器的工具或者服务都有类似的架构。比如:连接处理、授权认证、安全等。

  • 第二层的架构包括大多数的MySQL的核心服务。包括:查询解析、分析、优化、缓存以及所有的内置函数(例如:日期、时间、数字和加密函数)。同时,所有的跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。

  • 第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。服务器通过API和存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明化。存储引擎API包含十几个底层函数,用于执行“开始一个事务”等操作。但存储引擎一般不会去解析SQL(InnoDB会解析外键定义,因为其本身没有实现该功能),不同存储引擎之间也不会相互通信,而只是简单的响应上层的服务器请求。

  • 第四层包含了文件系统,所有的表结构和数据以及用户操作的日志最终还是以文件的形式存储在硬盘上。

MySQL中一条SQL的执行过程:

  1. 由客户端向mysqld发送SQL语句

  2. 连接层

    • 提供连接协议:TCP/IP、SOCKET
    • 提供验证:用户、密码、IP、SOCKET
    • 提供专用连接线程:接收SQL、返回结果,我们可以通过下面的语句来查看到当前有几个客户端连接:
    mysql> show processlist;
    +----+------+-----------+------+---------+------+----------+------------------+
    | Id | User | Host      | db   | Command | Time | State    | Info             |
    +----+------+-----------+------+---------+------+----------+------------------+
    |  3 | root | localhost | NULL | Sleep   |   20 |          | NULL             |
    |  4 | root | localhost | NULL | Query   |    0 | starting | show processlist |
    +----+------+-----------+------+---------+------+----------+------------------+
    2 rows in set (0.00 sec)
    
  3. SQL层:

    • 接收上层传送过来的SQL语句
    • 语法验证模块:验证语句语法,是否满足SQL_MODE
    • 语义检查:判断SQL语句的类型
      • DDL:数据定义语言
      • DCL:数据控制语言
      • DML:数据操作语言
      • DQL:数据查询语言
      • .........
    • 权限检查:用户对库表有没有相关权限
    • 解析器:进行SQL预处理,产生执行计划
    • 优化器:根据解析器得出多种执行计划,进行选择最优的执行计划
      • 代价模型:资源(CPU、IO、MEM)的损耗评估性能情况
    • 执行器:根据最优执行计划,执行SQL语句,产生执行结果,数据在磁盘的某个位置上
    • 根据查询缓存(默认是关闭的),会使用redis、tair替代查询缓存功能
    • 提供日志记录:binlog,默认是关闭的
  4. 存储引擎层(类似Linux中的文件系统):根据SQL层执行的结果,从磁盘上拿数据,将16进制的磁盘数据,交由SQL结构化成表,由连接层的专用线程返回给用户

逻辑结构

在MySQL中,逻辑结构由库和表组成,并且各自有各自的规范:

  • 库:
    • 库名称
    • 库属性
  • 表(二维表):
    • 表名
    • 表属性
    • 列:列名、列属性
    • 数据行,也叫记录

库的物理结构

库相当于目录(文件夹)。

表的物理结构

在磁盘上,表的物理存储根据存储引擎的不同而有所不同,目前常用的有两种:

MyIASM:

  • user.frm:存储列相关信息
  • user.MYD:存储记录
  • user.MYI:索引

INNODB:

  • frm:存储列相关信息
  • ibd:数据行和索引信息
[root@cs mysql]# ll user.*
-rw-r----- 1 mysql mysql 10816 6月   8 09:25 user.frm
-rw-r----- 1 mysql mysql   396 6月   8 09:51 user.MYD
-rw-r----- 1 mysql mysql  4096 6月   8 09:51 user.MYI
[root@cs mysql]# ll time_zone.*
-rw-r----- 1 mysql mysql  8636 6月   8 09:25 time_zone.frm
-rw-r----- 1 mysql mysql 98304 6月   8 09:25 time_zone.ibd

如上示例是两种不同存储引擎的表的物理结构。

我们可以对应来理解:

  • 数据库相当于文件夹。
  • 数据表相当于文件夹内的Excel表。
  • 记录相当于Excel表中的一行行数据。

只不过MySQL对这些有更严格的规范。

SQL介绍

SQL历史

SQL是一种结构化的查询语言。

关于SQL的历史:

更多参考维基百科

MySQL5.7以后符合SQL92标准的严格模式,通过sql_mode参数来控制。

常用的SQL分类

  • DDL(Data Definition Language):数据定义语言,就是我们在创建表的时候用到的一些sql,比如说:CREATE、ALTER、DROP等。DDL主要是用在定义或改变表的结构,数据类型,表之间的链接和约束等初始化工作上。
  • DCL(Data Control Language):数据控制语言,是用来设置或更改数据库用户或角色权限的语句,包括(grant,deny,revoke等)语句。这个比较少用到。
  • DML(Data Manipulation Language):数据操作语言,就是我们最经常用到的 SELECT、UPDATE、INSERT、DELETE。 主要用来对数据库的数据进行一些操作。

如何学好MySQL

  • 基础入门,参考自学SQL这个网站,有基础的讲解和在线练习,也有配套的视频
  • w3school的SQL 教程l你值得拥有
  • http://sqlfiddle.com/,这个网站,也是非常的厉害,支持多种关系型数据库,可以在线创建数据库和查询,非常厉害
  • http://www.sql-ex.ru/,貌似是俄罗斯开发者搞的刷SQL的网站,可以注册来刷SQL,提高SQL能力,缺点是该网站不支持中文
  • 再有就是牛客网的数据库SQL实战刷题了

欢迎斧正,that's all
posted @ 2018-09-20 15:19  听雨危楼  阅读(663)  评论(0编辑  收藏  举报