MySQL
文章目录 |
---|
MySQL 教程 | 菜鸟教程 (runoob.com) |
一、软件部署
1.1 Linux安装Mysql
首先查看系统是否安装了MySQL、Mariadb
rpm -qa |grep -i mariadb
rpm -qa |grep -i mysql
如果安装了,就卸载
rpm -e mariadb-libs-5.5.68-1.el7.x86_64
## 如果提示存在依赖关系,不让删,就用下面这个
yum remove mariadb-libs-5.5.68-1.el7.x86_64
上面都是环境准备,下面就开始正式操作
## 安装MySQL资源库
yum -y localinstall https://repo.mysql.com//mysql80-community-release-el7-1.noarch.rpm
## 正式安装
yum -y install mysql-community-server
## 启动并设置开机自启
systemctl start mysqld
systemctl enable mysqld
## 查看密码
grep 'temporary password' /var/log/mysqld.log
## 登录,修改密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Ljm3326116@123';
## 密码太复杂的对不对,修改密码的安全规则
set global validate_password.policy=0;
set global validate_password.length=1;
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
## 设置可以进行远程ROOT登陆
ALTER USER 'root'@'localhost' IDENTIFIED BY '123';
flush privileges;
## 好了,开始用Navicat开始尽情玩耍
这个有问题
1.2 Docker安装Mysql
核心两步操作解决
## 拉镜像
docker pull mysql
## 直接运行
docker run -p 3326:3306 --name mysql-demo -e MYSQL_ROOT_PASSWORD=123456 -d mysql
## 进容器里面
docker exec -it XXXXXX /bin/bash
## 安装个VIM/PING
apt-get update
apt-get install -y vim
apt-get install -y inetutils-ping
## 可能因为网络关系,会报错很多次,要耐心
## 安装容器化有个坑点,需要关闭TCP6
1.3 Windows安装MySQL
文章目录 |
---|
https://www.huhexian.com/44647.html |
https://blog.youkuaiyun.com/weixin_42599091/article/details/125224850 |
https://dev.mysql.com/downloads/mysql/5.7.html#downloads |
二、玩起来
2.1 增删改查
基本命令
概述 | 命令 |
---|---|
创建数据库 | CREATE DATABASE 数据库名; |
删除数据库 | drop database <数据库名>; |
创建数据表 | CREATE TABLE table_name (column_name column_type); |
删除数据表 | DROP TABLE table_name ; |
插入数据 | INSERT INTO table_name ( field1, field2,…fieldN ) VALUES ( value1, value2,…valueN ); |
查询数据 | SELECT |
条件查询 | where |
条件更新 | UPDATE table_name SET field1=new-value1, field2=new-value2 WHERE 1=1 |
条件删除 | DELETE FROM table_name WHERE 1=1 |
通配符 | Like |
连接表结果 | 查询结果1 UNION [ ALL (返回所有包括重复数据) |
排序 | ORDER BY 【desc】 |
分组 | GROUP BY |
连接符 | INNER JOIN(内连接,或等值连接),LEFT JOIN(左连接),RIGHT JOIN(右连接) |
修改表名或字段名 | ALTER |
运算符
符号 | 描述 | 备注 |
---|---|---|
= | 等于 | |
<>, != | 不等于 | |
> | 大于 | |
< | 小于 | |
<= | 小于等于 | |
>= | 大于等于 | |
BETWEEN | 在两值之间 | >=min&&<=max |
NOT BETWEEN | 不在两值之间 | |
IN | 在集合中 | |
NOT IN | 不在集合中 | |
<=> | 严格比较两个NULL值是否相等 | 两个操作码均为NULL时,其所得值为1;而当一个操作码为NULL时,其所得值为0 |
LIKE | 模糊匹配 | |
REGEXP 或 RLIKE | 正则式匹配 | |
IS NULL | 为空 | |
IS NOT NULL | 不为空 |
函数
2.2 索引基础
这里只说怎么玩,具体什么原理的放在原理篇上说明
基本语法
-
查看索引
SHOW INDEX FROM t_emp
-
创建索引
CREATE INDEX index_name on t_emp(name)
-
删除索引
DROP INDEX [indexName] ON mytable
-
修改索引(删了重新建一个不就好了…)
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
索引分类
- 单值索引
- 唯一索引,值唯一,可以有空值
- 主键索引
- 复合索引
哪些情况需要创建索引
- 频繁作为查询条件的字段
- 两张表关联,对关联外键做索引
- 排序/统计/分组的字段也可以做索引
查看执行效率
-
show status like ‘Com_%’,查看在当前会话中已经执行过的各类SQL的执行频率
当然,它不止是能查看SQL,服务器的运行时间、连接次数等也可以进行查看
-
show profiles,查看SQL执行过程的一个性能分析工具,我们可以利用它查看SQL命中缓冲的概率
-
EXPLAIN
+ SQL语句,SQL语句的性能分析,索引优化的核心
2.3 索引进阶
主要谈优化
2.3.1 Explain各字段解释
基本
字段名称 | 解释 | |
---|---|---|
id | 表示查询钟执行select子句或操作表的顺序 | id相同,执行顺序从上到下;id不同,id值越大越先被执行 |
select_type | 查询类型 | |
table | 显示这一行的数据是关于哪张表的 | |
partitions | 代表分区表中的命中情况,非分区表,该项为null | |
type | 表示表的连接类型 | |
possible_keys | 显示可能应用在这张表中的索引,一个或多个 | |
key | 实际使用的索引。如果为NULL,则没有使用索引 | |
key_len | Where条件后面的筛选条件命中的索引长度 | |
ref | 显示索引的哪一列被使用了 | |
rows | 显示查询了多少行,越小越好 | |
filtered | 不想知道… | |
extra | 其他 |
Select_type
Simple
单表Primary
查询中若包含任何复杂的子部分,最外层查询则被标记为PrimaryDerived
是在FROM列表中包含的子查询Subquery
指在SELECT或WHERE列表中包含了子查,子查询基于外层,就是A=B的那个DependenSubquery
依赖查询,在SELECT或WHERE列表中包含了子查询,子查询基于外层,和上面最大的不同就在于上面是=这里是inUNCACHEABLE SUBQUREY
缓存不可用,查询包含不断变化的变量Union
两张表拼接的时候出现UnionResult
从拼接表拿结果的Select查询
Type
索引使用的理想情况
-
system
表仅有一行,这是const类型的特列(等于系统表),平时不会出现,这个也可以忽略不计
-
const
表示通过索引一次就找到了,const用于比较primary key或者unique索引。因 为只匹配一行数据,所以很快如。将主键置于where列表中,MySQL就能将该查询转换为一个常量
-
eq_ref
唯一性索引
扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描 -
Ref
非唯一性
扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问
,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体 -
ref_or_null
有字段是空的或者是是哪个值
很遗憾,人生总有不如意的时候
-
index_merge
组合索引,一般在有or的SQL中
-
unique_subquery
子查询里面用了唯一索引
-
index_subquery
关联查询的时候用了外键索引
-
range
只检索了给定范围的行
-
index
索引没生效,可能是查询中用索引进行了排序分组
-
ALL
全表查询
Extra
(11条消息) MySQL中explain执行计划中额外信息字段(Extra)详解_poxiaonie的-优快云博客
2.3.2 单表索引优化原则
- 有多少个条件就创建多少个条件的索引
- 索引多个列的时候,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用
- 索引列中尽量不要出现大量重复数据,例如性别列,就男女,有什么好索引的??
- 对 where,on,group by,order by 中出现的列使用索引
- 范围查询,And
2.3.3 索引失效的情况
- 索引用了计算、函数、(自动or手动)类型转换
- 使用不等于
- IS NOT NULL
- Like通配符以%开头
- 类型转换,例如字符串的情况一定要引号打起来,不然就会被转换

2.3.4 其他优化
关联查询
子查询
排序分组
2.4 慢查询
MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中
2.5 视图
将一段查询sql封装为一个虚拟的表, 这个虚拟表只保存了sql逻辑,不会保存任何查询结果
2.6 用户权限管理
1
2.7 SQL Mode
在MySQL中,它用来解决几类问题
- 设置不同程度的数据校验,保障数据准确
- 迁移数据库时,可以对SQL进行语法校验,来适配兼容性问题
2.8 触发器
1
2.9 事务控制
1
三、原理篇
3.1 MySQL的逻辑架构
3.2 存储引擎
查询当前数据库支持的存储引擎
show engines \G
各大存储引擎对比
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-le6njZZd-1663407243910)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/mysql存储引擎对比-1.png)]
3.3 聚簇索引与非聚簇索引
聚簇索引和非聚簇索引(通俗易懂 言简意赅) - 创天创世纪 - 博客园 (cnblogs.com)
-
聚簇索引
聚拢到一块儿,
主键用的是聚簇索引
,按照一定的顺序排好,如果要查1-6 只需要把1-6索引取出来不用扫整个索引 -
非聚簇索引
分散到四周,不是按照顺序拍的,得扫描整个索引,在字典查 猫或狗 我们先查反犬旁 再分别找,
非主键用的是非聚簇索引

InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构
聚簇索引 就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分;
那么,什么是B+Tree呢?
3.4 索引的数据结构
二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree)B+树_TigerChen-优快云博客
3.5 关系数据库中连接池的机制是
前提:为数据库连接建立一个缓冲池。
(1)从连接池获取或创建可用连接
(2)使用完毕之后,把连接返回给连接池
(3)在系统关闭前,断开所有连接并释放连接占用的系统资源
(4)能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值
3.6 字符集
utf8mb4 是 utf8 的超集,有存储 4 字节例如表情符号时,使用它
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7wILASiE-1663407243910)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/mysql-字符集对比-1.png)]
四、架构篇
4.1 主从复制
1
4.2 MyCAT
另外开多一个markdown