1、什么是MySQL高级优化
数据库内部结构和原理
数据库建模优化
数据库索引建立
SQL 语句优化
SQL 编程(自定义函数、存储过程、触发器、定时任务)
mysql 服务器的安装配置
数据库的性能监控分析与系统优化
各种参数常量设定
主从复制
分布式架构搭建、垂直切割和水平切割
数据迁移
容灾备份和恢复
shell 或python 等脚本语言开发
对开源数据库进行二次开发
2、Linux系统下安装Mysql
2.1 下载安装
(1)Mysql官网下载安装包
下载完成后,将安装包(一个服务端,一个客户端)放在/opt目录下(复习linux操作系统目录)
(2)安装之前,检查系统有没有安装Mysql
指令:rpm -qa|grep -i mysql
如果安装过,就删除。 指令:rpm -e mysql
(3)安装mysql
先安装服务端:
服务端安装完成后会提示设置密码
安装客户端
(4)查看是否安装成功
复习:Linux
cat 查看文件内容,是以只读的方式打开。
•基本语法
cat [选项] 要查看的文件
•常用选项
-n :显示行号
/etc/passwd文件
用户(user)的配置文件,记录用户的各种信息
/etc/group 文件
组(group)的配置文件,记录Linux包含的组的信息
每行含义:组名:口令:组标识号:组内用户列表
(5)启动Mysql服务(这样,就能远程连接上mysql了)
启动服务:service mysql start
(6)启动成功之后,查看Mysql进程
指令:ps -ef|grep mysql
(7)设置开机自启动mysql服务
指令:chkconfig mysql on
查看是否设置成功: chkconfig --list|grep mysql
或者使用 ntsysv指令,进入设置界面
2.2 安装位置
Mysql主要安装在了4个目录下,每个地方的意义不同。常用的数据库文件放在var目录下
2.3 修改配置文件
为了避免修改错误,导致程序崩溃,先拷贝一个原厂文件出来备份
(1)进入mysql配置文件目录,并且找到配置文件
进入配置文件目录:cd /usr/share/mysql
确认确实进入了:该目录:pwd (查看当前目录绝对路径)
显示该所有文件(寻找配置文件):ls -l
在列表中,可以看到 my-huge.cnf,就是他
(2)拷贝到/etc/ 目录下,并重命名为my.cnf
在/usr/share/mysql/ 中找到my.cnf 的配置文件,拷贝其中的my-huge.cnf 到/etc/ 并命名为my.cnf 。
指令:cp my-huge.cnf /etc/my.cnf
注意:必须将文件拷贝到指定路径,且名称为my.cnf
特别注意:mysql不同版本之间,配置文件名字可能不同,比如5.5还叫my-huge.cnf。5.6就改名字成my-default.cnf了
拷贝完成后,记得重启mysql(分别执行service mysql stop和service mysql start)
2.3.1 修改Mysql字符集
如果在建库建表的时候,没有明确指定字符集,则采用默认的字符集latin1,其中是不包含中文字符的。
查看默认的编码字符集:show variables like ‘%char%’ (进入mysql客户端以后)
退出mysql客户端 回到命令行,回到etc文件夹,打开复制好的my.cnf配置文件
cd /etc
编辑配置文件: vim my.cnf
再以下三处[xx] 下面粘贴以下代码,保存后,即可完成修改
[client]
default-character-set=utf8
[mysqld]
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci
[mysql]
default-character-set=utf8
特别注意:里面的东西,别乱动,会影响mysql启动,最好从官网文档复制粘贴过来
说明:mysqld,d 代表demon,守护进程。
重启服务,即可修改成功。但特别注意,新的字符集只对新数据库有效,因此最好装完mysql马上就修改字符集
3、Mysql配置文件
4、Mysql 逻辑架构简介
4.1 整体架构图
和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
4.2 各层介绍:
(1)连接层
最上层是一些客户端和连接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
(2)服务层
第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓存的查询, SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用素引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
Management Serveices & Utilities | 系统管理和控制工具 |
SQL Interface: | SQL 接口。接受用户的SQL 命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface |
Parser | 解析器。SQL 命令传递到解析器的时候会被解析器验证和解析 |
Optimizer | 查询优化器。SQL 语句在查询之前会使用查询优化器对查询进行优化,比如有where 条件时,优化器来决定先投影还是先过滤。 |
Cache 和Buffer | 查询缓存。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等 |
(3)引擎层
存储引擎层,存储引擎真正的负责了MySQL 中数据的存储和提取,服务器通过API 与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
(4)存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
4.3 存储引擎介绍— MyISAN 和 InnoDB
(1)查看数据库的指令
show engines:查看所有的数据库引擎(一般开发工程师不用)
show variables like '%storage_engine%' :查看默认的数据库引擎
(2)MyISAN 和 InnoDB 对比
对比项 | MyISAM | InnoDB |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 | 行锁,操作时只锁某一行,不对其它行有影响,适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高,而且内存大小对性能有决定性的影响 |
关注点 | 读性能 | 并发写、事务、资源 |
默认安装 | Y | Y |
默认使用 | N | Y |
自带系统表使用 | Y | N |
4.4、SQL执行流程
(1)程序员写的SQL语句:
(2)机器实际执行的顺序
注意:随着Mysql 版本的更新换代,其优化器也在不断的升级,优化器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。下面是经常出现的查询顺序:
5、索引优化
引入:SQL性能下降的原因
对于java工程师来说,主要关注前两个。数据库工程师,才关注后面2个
5.1 优化第一步,写好Join连接
具体案例 请学习https://www.runoob.com/sql/sql-join.html 的连接部分
注意1:全集的写法。
蓝色表示A表独有,城市表示b表独有
注意2:去除A、B交集的写法
5.2 索引
5.2.1 简介
MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。可以简单理解为排好序的快速查找数据结构。
5.2.2 优缺点
(1)优点
① 提高数据检索的效率,降低数据库的IO成本。
② 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。
(2)缺点
① 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
② 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。
6、Mysql索引
6.1 Btree索引
MySQL使用的是Btree索引
(1)简介
一颗b 树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示)
如磁盘块1 包含数据项17 和35,包含指针P1、P2、P3,
P1 表示小于17 的磁盘块,P2 表示在17 和35 之间的磁盘块,P3 表示大于35 的磁盘块。
真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。
非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35 并不真实存在于数据表中。
(2)查找过程:
如果要查找数据项29,那么首先会把磁盘块1 由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17 和35 之间,锁定磁盘块1 的P2 指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2 指针的磁盘地址把磁盘块3 由磁盘加载到内存,发生第二次IO,29 在26 和30 之间,锁定磁盘块3 的P2 指针,通过指针加载磁盘块8 到内存,发生第三次IO,同时内存中做