MySQL的基本使用(数据库管理系统)
1、MySQL的基本概念
MySQL是目前应用最广泛的开源关系数据库。MySQL最早是由瑞典的MySQL AB公司开发,该公司在2008年被SUN公司收购,紧接着,SUN公司在2009年被Oracle公司收购,所以MySQL最终就变成了Oracle旗下的产品。
MySQL 是一个非常流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的关系数据库管理系统(Relational Database Management System,简称RDBMS)之一,并且它是开源免费的。MySQL 由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL 数据库管理系统有以下特点:
- MySQL 是开源的,所以你不需要支付额外的费用。
- MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
- MySQL 使用标准的 SQL 数据语言形式。
- MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。
- MySQL 对PHP有很好的支持,PHP 是目前最流行的 Web 开发语言。
- MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。
- MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。
和其他关系数据库有所不同的是,MySQL本身实际上只是一个SQL接口,它的内部还包含了多种数据引擎,常用的包括:
- InnoDB:由Innobase Oy公司开发的一款支持事务的数据库引擎,2006年被Oracle收购;
- MyISAM:MySQL早期集成的默认数据库引擎,不支持事务。
MySQL接口和数据库引擎的关系就好比某某浏览器和浏览器引擎(IE引擎或Webkit引擎)的关系。对用户而言,切换浏览器引擎不影响浏览器界面,切换MySQL引擎不影响自己写的应用程序使用MySQL的接口。
使用MySQL时,不同的表还可以使用不同的数据库引擎。如果你不知道应该采用哪种引擎,记住总是选择InnoDB就好了。
1.1、MySQL的各种版本
MySQL官方版本分了好几个版本:
- Community Edition:社区开源版本,免费;
- Standard Edition:标准版;
- Enterprise Edition:企业版;
- Cluster Carrier Grade Edition:集群版。
以上版本的功能依次递增,价格也依次递增。不过,功能增加的主要是监控、集群等管理功能,对于基本的SQL功能是完全一样的。
所以使用MySQL就带来了一个巨大的好处:可以在自己的电脑上安装免费的Community Edition版本,进行学习、开发、测试。部署的时候,可以选择付费的高级版本,或者云服务商提供的兼容版本,而不需要对应用程序本身做改动。
因为MySQL一开始就是开源的,所以基于MySQL的开源版本,又衍生出了各种版本:
MariaDB:由MySQL的创始人创建的一个开源分支版本,使用XtraDB引擎。
Aurora:由Amazon改进的一个MySQL版本,专门提供给在AWS托管MySQL用户,号称5倍的性能提升。
PolarDB:由Alibaba改进的一个MySQL版本,专门提供给在阿里云托管的MySQL用户,号称6倍的性能提升。
1.2、其他几种常见的数据库管理系统
常用的数据库软件有:Oracle、MySQL、Microsoft SQL Server、DB2、MongoDB 等等
- Oracle:Oracle是甲骨文(Oracle)公司旗下的关系数据库管理系统,它是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是种高效率、可靠性好的适应高吞吐量的数据库解决方案。Oracle是收费的。
- MySQL:MySQL是流行的关系型数据库管理系统,特别是在WEB应用方面,MySQL是非常流行的关系数据库管理系统。MySQL体积小、速度快、开放源码这特点,一般中小型网站的开发都选择MySQL作为网站数据库。MySQL是开源免费的,但被Oracle收购后,MySQL6.x版本开始收费
- Microsoft SQL Server:Microsoft SQL Server是Microsoft公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点,是个全面的数据库平台。SqlServer是收费的。
- DB2:DB2是IBM出品的系列关系型数据库管理系统,分别在不同的操作系统平台上服务。常应用于银行系统中。DB2是收费的。
- MongoDB:MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
2、在Linux系统上安装MySQL
2.1、卸载Linux系统默认的mysql相关组件
(1)CentOS6
CentOS6 环境下,默认在安装 Linux 时,会自带 mysql 相关的组件,我们需要先把这些组件都卸载,否则在安装 mysql 时会提示有冲突导致安装失败。
执行命令:rpm -qa|grep mysql 来查看是否有相关组件已安装:
如果有,则需先卸载 Linux 系统自带的 mysql 组件,执行卸载命令: rpm -e --nodeps
(2)CentOS7
CentOS7 环境下,默认在安装 Linux 时,会自带了 mariadb(mysql 完全开源版本)相关的组件,我们也需要先把这些组件都卸载,否则在安装 mysql 时会提示有冲突导致安装失败。
执行命令:rpm -qa|grep mariad 来查看是否有相关组件已安装:
如果有,则需先卸载 Linux 系统自带的 mysql 组件,执行卸载命令: rpm -e --nodeps mariadb-libs
2.2、下载mysql
官网下载地址:http://dev.mysql.com/downloads/mysql/
msyql8 通过 rpm 包下载安装可参考:https://www.cnblogs.com/l-y-h/p/12576633.html
以下我们安装的是 mysql5.5.48 版本,并且使用 rpm 包进行安装,可直接到 https://downloads.mysql.com/archives/community/ 地址进行下载安装包。
如下:
只需要下载 mysql-server 和 mysql-client 包即可。
2.3、安装mysql
将 rpm 安装包上传至 Linux 系统上(这里我们使用的是 centos7 版本的 Linux系统),比如上传至 /usr/mysoft 目录下,切换至该目录下,并执行以下命令进行安装:
执行命令:rpm -ivh MySQL-client-5.5.48-1.linux2.6.x86_64.rpm 安装 mysql-client 客户端:
执行命令:rpm -ivh MySQL-server-5.5.48-1.linux2.6.x86_64.rpm 安装 mysql-server 服务器:
安装完成后,会提示一些警告,意思是提示我们设置 root 用户的密码。
2.3.1、查看安装是否成功
执行命令:mysqladmin --version 可查看安装的 mysql 版本,有输出则证明已安装成功。
2.3.2、设置root用户的密码
mysql 如果没有设置密码,启动 mysql 服务后直接输入 mysql 即可连接 mysql,但这样很不安全,所以 mysql 必须得设置密码。
通过命令:mysqladmin -u root password 密码 可设置 root 用户的密码:
2.4、启动停止mysql服务
1.4.1、查看mysql运行状态
可通过命令:service mysql status 来查看 mysql 的状态
2.4.2、启动mysql服务
启动服务:service mysql start
重启服务:service mysql restart。如果 mysql 此时并没有在运行,则该命令会把 mysql 给启动起来。
启动之后,可以查看到 mysql 的进程:
2.4.3、停止mysql服务
停止服务:service mysql stop
2.4.4、mysql开机自启动
Mysql 服务默认情况下是开机后就会自动启动的,如果想要修改,可以通过 ntsysv 进行修改。
执行 ntsysv 命令,会弹出以下窗口:
可以看到,mysql 前面有 *,表示是启动启动的。我们可以使用空格来切换是否取消自启动,然后按 TAB 键来切换选中“确定”或者“取消”按钮,最后直接 enter 确定即可。
3、mysql的安装位置
mysql 在安装启动后,通过查看进程可以看到 mysql 一些目录的参数,如下:
这些参数就是指定 mysql 的一些相关目录的位置,具体说明如下:
其中,/var/lib/mysql 目录存放着数据库文件:
/usr/share/mysql 存放着配置文件:
3.1、mysql的配置文件
mysql 的配置以 cnf 作为后缀,我们可以先输入 which mysql 命令,得到 mysql 脚本位置,然后再在查询出来的 MySQL 路径后加上 --verbose --help | grep -A 1 'Default options' ,比如:/usr/bin/mysql --verbose --help | grep -A 1 'Default options',即可看到 mysql 的配置文件 my.cnf 的所在目录。
上面列出了多个目录的意思是指,mysql 首先读取的是 /etc/my.cnf 文件作为配置文件,如果前一个文件不存在则继续读 /etc/mysql/my.cnf 文件,依此类推。
mysql 安装完后可能没有 /etc/my.cnf 文件,你可以在/usr/local/share/mysql/下看到:my-huge.cnf、my-innodb-heavy-4G.cnf、my-large.cnf、my-medium.cnf、my-small.cnf 等文件,可以将其中合适你机器配置的文件作为 /etc/my.cnf 文件拷贝到相应目录。
- my-huge.cnf:针对一个内存1-2GB的系统,系统主要运行MySQL。
- my-small.cnf:内存 <= 64M
- my-medium.cnf:内存 128M
- my-large.cnf :内存 512M
- my-innodb-heavy-4G.cnf:内存 4GB
my-small.cnf my-medium.cnf my-large.cnf my-huge.cnf 是 MySQL 默认的几个配置文件。针对不同配置的服务器可以使用不同的配置文件,将你需要的那一个.cnf文件修改为 my.cnf,存放到 MySQL 的安装目录。
4、mysql 字符集
4.1、查看mysql字符集
mysql 数据库的默认字符集并不是 utf-8,而是 atin1(该字符集是包含中文字符的),所以在往数据库插入中文时,查询出来的可能就会是乱码。我们需要把数据库的字符集设置为 utf-8。
可通过命令:show variables like '%char%'; 来查询所有跟字符集相关的信息。
上面列出的参数说明如下:
- character_set_client:客户端请求数据的字符集
- character_set_connection:客户机/服务器连接的字符集
- character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。
- character_set_filesystem:把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的
- character_set_results:结果集,返回给客户端的字符集
- character_set_server:数据库服务器的默认字符集
- character_set_system:系统字符集,这个值总是utf8,不需要设置。这个字符集用于数据库对象(如表和列)的名字,也用于存储在目录表中的函数的名字。
我们可以通过 show create database 库名; 命令来查看某一数据库的字符集,如下:
4.2、修改mysql的默认字符集
我们可以通过修改 mysql 的配置文件,以此来修改 mysql 的默认字符集。
首先,将 /usr/share/mysql/my-huge.cnf 文件拷贝到 /etc/my.cnf 文件中,即执行命令:cp /usr/share/mysql/my-huge.cnf /etc/my.cnf,并编辑 my.cnf 文件添加以下内容:
[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
然后通过命令:service mysql restart 重启 mysql,再次进入 mysql 查看字符集,可以看到已经生效。
但是请注意:已经创建的数据库的字符集并不会自动发生变化,参数修改只对新建的数据库有效!所以我们在创建数据库之前一般要先设置好字符集。
我们也可以修改某一数据库甚至某一表的字符集,但是无论是修改 mysql 配置文件或是修改库、表字符集,已经乱码的数据都是无法改变的,只能删除数据重新插入或更新数据才可以完全解决。
# 修改数据库的字符集
alter database mytestdb character set 'utf8';
# 修改数据表的字符集
alter table mytesttable character set 'utf8';
4.3、设置大小写不敏感
我们可以通过命令:show variables like '%lower_case_table_names%'; 来查看 mysql 数据库是否对大小写敏感。
可以看到,默认情况下,mysql 是对大小写敏感的。比如我们通过 select * from TESTDB; 就无法找到 testdb 表。
我们可以通过修改配置文件来配置数据库大小写不敏感,在 my.cnf 配置文件的 [mysqld] 中加入 lower_case_table_names = 1,如下:
然后通过 service mysql restart 重启服务器即可。此时我们通过 select * from TESTDB; 就可以找到 testdb 表。
注意:如果要设置属性为大小写不敏感,要在重启数据库实例之前就需要将原来的数据库和表转换为小写,否则将找不到数据库名,因为设置为大小写不敏感时,sql 语句都会转换为小写再对表进行查找。在进行数据库参数设置之前,需要掌握这个参数带来的影响,切不可盲目设置。
5、mysql的逻辑架构
和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
简化的 mysql 逻辑架构图:
详细版 mysql 逻辑架构:
- Connectors
指的是不同语言中与SQL的交互。
- 连接层(connection pool)
该层是客户端的连接服务,主要完成客户端的连接处理,授权认证。在该层有一个线程池,每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
- 服务层
中间这一层可以完成查询解析,分析,优化,缓存。存储过程,触发器,视图也是在这一层。
Management Serveices & Utilities | 系统管理和控制工具 |
SQL Interface | SQL 接口。接受用户的 SQL 命令,并且返回用户需要查询的结果。比如 select from 就是调用 SQL Interface |
Parser | 解析器。 SQL 命令传递到解析器的时候会被解析器验证和解析 |
Optimizer | 查询优化器。 SQL 语句在查询之前会使用查询优化器对查询进行优化,比如有 where 条件时,优化器来决定先投影还是先过滤。 |
Cache 和 Buffe | 查询缓存。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取 数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存, 权限缓存等 |
- 引擎层
负责mysql中数据的存储和提取。和其它数据库有所不同,mysql的存储引擎是可插拔的,可以根据不同的场合使用不同的存储引擎。
- 存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
5.1、存储引擎
存储引擎:存储引擎就是存储数据,更新、查询数据,建立索引等等的技术实现方式,mysql5.0支持的存储引擎包括: InnoDB 、MyISAM 、BDB、MEMORY、MERGE、EXAMPLE、NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED等,其中使用最多的是InnoDB 和MyISAM,mysql5.5之后InnoDB是默认的存储引擎.
通过命令:show engines; 可查看使用的 mysql 提供了什么存储引擎。
通过命令:show variables like '%storage_engine%'; 可查看当前默认使用的存储引擎
InnoDB 存储引擎和 MyISAM 的对比:
对比项 | MyISAM | InnoDB |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 |
支持表级锁,不支持行级锁 即使操作一条记录也会锁住整个表, 不适合高并发的操作。 |
支持表级锁和行级锁 操作时只锁某一行,不对其它行有影响, 适合高并发的操作。 (只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!) |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内 存大小对性能有决定性的影响 |
关注点 | 读性能 | 并发写、事务、资源 |
默认安装 | Y | Y |
默认使用 | N | Y |
自 带 系 统 表 使用 | Y | N |
6、MySQL的执行过程
6.1、mysql的大致查询流程
mysql 的查询流程大致是:
1)mysql 客户端通过协议与 mysql 服务器建连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果, 否则进行语句解析,也就是说,在解析查询之前,服务器会先访问查询缓存(query cache)——它存储 SELECT 语句以及 相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。
2)语法解析器和预处理:首先 mysql 通过关键字将 SQL 语句进行解析,并生成一颗对应的“解析树”。mysql 解析 器将使用 mysql 语法规则验证和解析查询;预处理器则根据一些 mysql 规则进一步检查解析树是否合法。
3)查询优化器:当解析树被认为是合法的了,并且由优化器将其转化成执行计划。一条查询可以有很多种执行方式, 最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。
4)然后,mysql 默认使用的 BTREE 索引,并且一个大致方向是:无论怎么折腾 sql,至少在目前来说,mysql 最多只 用到表中的一个索引。
6.2、SQL的执行顺序
一般来说,我们手写SQL的顺序如下:
真正执行的顺序: 随着 Mysql 版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动 态调整执行顺序。下面是经常出现的查询顺序: