MySQL - CRUD/索引优化/原理/主从

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不为空
函数

MySQL 函数 | 菜鸟教程 (runoob.com)

2.2 索引基础

这里只说怎么玩,具体什么原理的放在原理篇上说明

基本语法
  1. 查看索引

    SHOW INDEX FROM t_emp

  2. 创建索引

    CREATE INDEX index_name on t_emp(name)

  3. 删除索引

    DROP INDEX [indexName] ON mytable

  4. 修改索引(删了重新建一个不就好了…)

    ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)

索引分类
  • 单值索引
  • 唯一索引,值唯一,可以有空值
  • 主键索引
  • 复合索引
哪些情况需要创建索引
  1. 频繁作为查询条件的字段
  2. 两张表关联,对关联外键做索引
  3. 排序/统计/分组的字段也可以做索引
查看执行效率
  1. show status like ‘Com_%’,查看在当前会话中已经执行过的各类SQL的执行频率

    当然,它不止是能查看SQL,服务器的运行时间、连接次数等也可以进行查看

  2. show profiles,查看SQL执行过程的一个性能分析工具,我们可以利用它查看SQL命中缓冲的概率

  3. 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_lenWhere条件后面的筛选条件命中的索引长度
ref显示索引的哪一列被使用了
rows显示查询了多少行,越小越好
filtered不想知道…
extra其他
Select_type
  1. Simple单表
  2. Primary查询中若包含任何复杂的子部分,最外层查询则被标记为Primary
  3. Derived是在FROM列表中包含的子查询
  4. Subquery指在SELECT或WHERE列表中包含了子查,子查询基于外层,就是A=B的那个
  5. DependenSubquery依赖查询,在SELECT或WHERE列表中包含了子查询,子查询基于外层,和上面最大的不同就在于上面是=这里是in
  6. UNCACHEABLE SUBQUREY缓存不可用,查询包含不断变化的变量
  7. Union两张表拼接的时候出现
  8. UnionResult从拼接表拿结果的Select查询
Type

索引使用的理想情况

  1. system

    表仅有一行,这是const类型的特列(等于系统表),平时不会出现,这个也可以忽略不计

  2. const

    表示通过索引一次就找到了,const用于比较primary key或者unique索引。因 为只匹配一行数据,所以很快如。将主键置于where列表中,MySQL就能将该查询转换为一个常量

  3. eq_ref

    唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

  4. Ref

    非唯一性扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体

  5. ref_or_null

    有字段是空的或者是是哪个值

很遗憾,人生总有不如意的时候

  1. index_merge

    组合索引,一般在有or的SQL中

  2. unique_subquery

    子查询里面用了唯一索引

  3. index_subquery

    关联查询的时候用了外键索引

  4. range

    只检索了给定范围的行

  5. index

    索引没生效,可能是查询中用索引进行了排序分组

  6. ALL

    全表查询

Extra

(11条消息) MySQL中explain执行计划中额外信息字段(Extra)详解_poxiaonie的-优快云博客

2.3.2 单表索引优化原则
  1. 有多少个条件就创建多少个条件的索引
  2. 索引多个列的时候,过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用
  3. 索引列中尽量不要出现大量重复数据,例如性别列,就男女,有什么好索引的??
  4. 对 where,on,group by,order by 中出现的列使用索引
  5. 范围查询,And
2.3.3 索引失效的情况
  1. 索引用了计算、函数、(自动or手动)类型转换
  2. 使用不等于
  3. IS NOT NULL
  4. Like通配符以%开头
  5. 类型转换,例如字符串的情况一定要引号打起来,不然就会被转换
2.3.4 其他优化

关联查询

子查询

排序分组

2.4 慢查询

MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中

2.5 视图

将一段查询sql封装为一个虚拟的表, 这个虚拟表只保存了sql逻辑,不会保存任何查询结果

2.6 用户权限管理

1

2.7 SQL Mode

在MySQL中,它用来解决几类问题

  1. 设置不同程度的数据校验,保障数据准确
  2. 迁移数据库时,可以对SQL进行语法校验,来适配兼容性问题

2.8 触发器

1

2.9 事务控制

1

三、原理篇

3.1 MySQL的逻辑架构

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

over

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值