MySQL 最重要、最与众不同的特性是它的存储引擎架构,这种架构的设计将查询处理 (Query Processing)及其他系统任务(Server Task)和数据的存储/提取相分离。这种 处理和存储分离的设计可以在使用时根据性能、特性,以及其他需求来选择数据存储 的方式。
由图,可以看出MySQL最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。
用户:进行数据库连接的人。
支持接口:是第三方语言提供和数据库连接的接口,常见的有jdbc,odbc,c的标准api函数等等。
管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等(见图)
连接层:提供与用户的连接服务,用于验证登录服务。
—> 连接池:由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
服务层:完成大多数的核心服务功能。有sql接口,解析器parser,优化器optimizer,查询缓存 cache/buffer 。
—>SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select * from就是调用SQL Interface
—>解析器: SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。其功能是:
a.将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b.如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
优化器:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。举一个例子:
select * from users where uname='admin';
1.这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行uname过滤。(选取)
2.这个select查询先根据*进行属性投影,而不是将属性全部取出以后再进行过滤。(投影)
3.将这两个查询条件联接起来生成最终查询结果。(联接)
—>缓存器: 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
简而言之, 服务层执行过程:sql语句通过sql接口,服务器如果缓存cache有命中查询结果,直接读取数据。如果没有命中查询结果,由解析器进行sql语句的解析,预处理,经过优化器进行优化后提交给引擎层。通俗地说—>服务层告诉引擎层要做什么。
引擎层: 提供各种存储引擎,真正的负责MySQL中数据的存储和提取。常见有innodb myisam 。innodb支持全文索引,事务(高并发),行锁,myisam 性能优先。 mysql中查询引擎语句:show engines.
通俗地说—>引擎层会转发服务层解析出来的sql语句告诉存储层要做什么(增删改查)并且告诉存储层要以何种方式做(innodb myisam等等)。
存储层: 数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
SQL的执行流程:数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL。由MySQL处理并返回执行结果。首先,其它编程语言通过SQL支持接口调用MySQL,MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理。当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询:由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构。解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行。确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回。
在我们专业老师的pdf资料里面每一层也讲得很细 见下
-- 查看最大连接数
show variables like '%max_connections%';
# 查询缓存配置情况
show variables like '%query_cache%';
MyISAM 不支持事务、也不支持外键,其优势是访问的速度快,对事务完整性 没有要求或者以 SELECT、INSERT 为主的应用。每个 MyISAM 在磁盘上存储成 三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm 文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)
InnoDB 存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比 MyISAM 的存储引擎,InnoDB 写的处理效率差一些,并且会占用更多的磁盘空 间以保存数据和索引。InnoDB:所有的表都保存在同一个数据文件中,InnoDB 表的大小只受限于操作系统文件的大小限制。Myisam 只缓存索引,不缓存真实数据;Innodb 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响。
MEMORY 存储引擎使用存在于内存中的内容来创建表。MEMORY 类型的表访问非常的快,因为它的数据是放在内存中的,并且默认使用 HASH 索引,但是 一旦服务关闭,表中的数据就会丢失。主要用于那些内容变化不频繁的代码表或者作为统计操作的中间结果表。
Yum安装mysql
Vim /etc/yum.repos.d/mysql.repo
再输入
yum install mysql-community-server
启动MySQL,设置开机启动
在线下载查看临时登录密码
输入账号密码
修改密码
2、通用二进制方式--生产环境
Installing MySQL on Unix/Linux Using Generic Binaries
1> 下载包 --glibc
[root@node4 ~]# ll mysql-5.7.14-linux-glibc2.5-x86_64.tar
-rw-r--r-- 1 root root 672716800 Jul 5 14:15 mysql-5.7.14-linux-glibc2.5-x86_64.tar
2> 创建用户及组
# groupadd -r mysql
# useradd mysql -r -g mysql -c "MySQL Server" -s /bin/false
3> 解压,软链接
# tar xf mysql-5.7.14-linux-glibc2.5-x86_64.tar -C /usr/local
# tar xf /usr/local/mysql-5.7.14-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
创建软链接:为了方便以后升级。
# ln -sv /usr/local/mysql-5.7.14-linux-glibc2.5-x86_64 /usr/local/mysql
‘/usr/local/mysql’ -> ‘/usr/local/mysql-5.7.14-linux-glibc2.5-x86_64'
4> 初始化
# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data
5> 提供配置文件和服务启动脚本
# cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
修改配置文件:vim /etc/my.cnf
[mysqld]
...
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
# 服务脚本
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
添加系统服务,并设置开机自启动
# chkconfig --add mysqld
# chkconfig mysqld on
6> 启动mysql
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
配置环境变量:
# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH