概述:
MySQL 是一个开源的关系型数据库,目前属于 Oracle 公司。
MySQL 是一种关系型数据库管理系统,将数据保存在不同的表中,而不是将数据放在一个大仓库内。
MySQL 使用标准的 SQL 数据语言形式。MySQL 采用了 GPL 协议
高级 MySQL
mysql 内核
sql优化
mysql 服务器的优化
各种参数常量设定
查询语句优化
主从复制
软硬件升级
容灾备份
sql 编程
MySQL 安装
连接层 => 服务层 => 引擎层 => 存储层
先建个表
CREATE TABLE `tbl_emp` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`deptId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) ,
KEY `fk_dept_id`(`deptId`)
)ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
CREATE TABLE `tbl_dept` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`deptName` varchar(30) DEFAULT NULL,
`locAdd` varchar(40) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8;
insert into tbl_dept values(null,'RD',1);
insert into tbl_dept values(null,'HR',12);
insert into tbl_dept values(null,'MK',13);
insert into tbl_dept values(null,'MIS',14);
insert into tbl_dept values(null,'FD',15);
insert into tbl_emp values(null,'z3',1);
insert into tbl_emp values(null,'z4',1);
insert into tbl_emp values(null,'z5',1);
insert into tbl_emp values(null,'w5',2);
insert into tbl_emp values(null,'w6',2);
insert into tbl_emp values(null,'s7',3);
insert into tbl_emp values(null,'s8',4);
insert into tbl_emp values(null,'s9',51);
FROM 笛卡尔积-- ON 主表保留-- JOIN、WHERE – GROUP BY – HAVING – SELECT-- ORDER BY – LIMIT
什么是索引
索引(Index)是数据结构,排好序的快速查找结构,用来帮助 MySQL 高效获取数据。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据。这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引
索引本身也很大,一般以索引文件形式存储在磁盘上
平常所说的索引,如果没有指定,都是 B 树(多路搜索树)结构的索引,其中聚集索引,次要索引,覆盖所以,复合索引,前缀索引,唯一索引默认都使用 B+树索引,统称索引。除了 B+ 树外,还有 hash,index 等。
优势:
提高数据检索的效率,降低数据库的 IO 成本。
通过索引对数据进行排序,降低数据排序的成本,降低了 CPU 的消耗
劣势:
会降低更新表的速度,在进行写操作时,不仅要保存数据,还要保存一下索引文件每次更新添加了索引的字段
索引分类:
基本语法
创建:
CREATE [UNIQUE] INDEX indexName ON myTable(columnName(length));
ALTER myTable ADD [UNIQUE] INDEX [indexName] ON (columnName(length))
删除:
DROP INDEX [indexName] ON myTable;
查看:
show INDEX FROM tableName;
常用添加索引 SQL:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list); 添加一个主键,索引值必须唯一,切且不能为 null
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list); 创建索引的值必须是唯一的,(除了 null 之外,null 可能会出现多次)
ALTER TABLE tbl_name ADD INDEX index_name (column_list); 添加普通索引,索引值可以出现多次
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list); 指定了索引为 FULLTEXT,用于全文索引
mysql 索引结构
哪些情况需要创建索引
哪些情况不适合创建索引
MySQL Query Optimizer
MySQL 常见瓶颈
什么是 explain?
使用 explain 关键字,可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是怎么处理SQL 语句的,分析查询语句或者表结构的性能瓶颈
explain使用:
字段解释
索引失效情况
慢查询的查找并捕获
优化
什么是慢查询日志
开启慢查询日志
SET GLOBAL slow_query_log = 1;
查看慢查询阈值时间
SHOW VARIABLES LIKE '%long_query_time%';
SHOW GLOBAL VARIABLES LIKE '%long_query_time%';
设置慢查询阈值时间
设置后需要重新连接或者新开会话才可以看到修改至哦
SET GLOBAL long_query_time = 3;
查看有多少条慢 SQL 记录
SHOW GLOBAL STATUS LIKE '%Slow_queries%'
什么是 profile
MySQL 提供的分析当前会话中语句执行到的资源消耗情况
查看 profiling是否开启
SHOW VARIABLES LIKE '%profiling%';
开启 profiling
SET PROFILING=on;
运行后查看结果并诊断 SQL
SHOW PROFILES;
SHOW PROFILE cpu, block io for query 前一步的query_id;
特点
偏向 MyISAM 存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低
展示哪些表被加锁了
show open tables;
show status like 'table%';
LOCK table 表名 read/write, 表名2 read/write;
读锁会阻塞写,写锁会阻塞读和写
特点:
偏向 Innodb 存储引擎,开销大,加锁慢,会出现死锁,锁粒度最小,发生冲突几率低,并发度高
无效索引行锁升级为表锁
如果查询字段未加索引,或者索引失效后,全表扫描后会导致行锁变表锁
间隙锁(Next-key)
用范围条件而不是相等条件检索数据的时候,并请求共享锁或者排它锁时,InnoDB 会给符合添加你的已有数据记录的索引项加锁,值在范围内但不存在的记录叫做间隙(GAP),
查看行锁
SHOW STATUS LIKE 'INNODB_ROW_LOCK%';
复制的基本原理
slave 从 master 读取 binlog 来进行数据同步
复制的基本原则
一主一从常见配置
server-id=1
:主服务器唯一idlogin-bin=本地路径下/msqlbin
:必须启用二进制文件log-err=本地路径/mysqlerr
:启用错误日志basedir=“根目录”
:根目录tmpdir=“临时目录路径”
:临时目录datadir="本地路径/Data/"
:数据目录read-only=0
:主机,读写都可以binlog-ignore-db=mysql
:设置不要复制的数据库binlog-do-db=需要复制的主数据库名字
:设置要复制的数据库server-id=2
:从服务器服务器 id 修改为systemctl stop firewall
GRANT REPLICATION SLAVE ON *.* TO 'username'@'从机服务器IP' IDENTIFIED BY 'password'
:授权给从机以什么用户身份启动flush privileges;
show master status
:查看主机状态GRANT MASTER TO MASTER_HOST='主机IP' MASTER_USER='username',MASTER_PASSWORD='password', MASTER_LOG_FILE='mysqlbin.具体数字',MASTER_LOG_POS=具体值;
start slave;
:启动从服务器复制功能show slave status\G
:查看主机是否配置成功
stop slave
show master status
查看最新状态改变