sql优化学习笔记

一、尚硅谷-----周阳

1、mysql的架构介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、mysql存储引擎

  1. 常用的两个MyISAM和InnoDB
  2. 查看mysql已提供的存储引擎命令:show engines;
  3. 查看已安装的mysql当前默认存储引擎:show variables like '%storage_engine%';
  4. MyISAM和InnoDB对比
    在这里插入图片描述

3、索引介绍

  1. 索引的介绍
  • 索引不是越多越好
  • 不要对经常变动的数据加索引
  • 小数据量的表不加索引
  • 索引一般加在常用来查询的字段上
# 显示所有的索引信息
show INDEX FROM sys_user 

# 添加一个全文索引(索引名)列名
ALTER TABLE test ADD FULLTEXT INDEX NAME(NAME) 

# 添加一个普通索引 命名规则--id_表名_字段名
CREATE INDEX id_test_name ON test(`NAME`)

# 添加一个组合索引
CREATE INDEX index_mytable_id_name ON mytable(id,name);

# 添加一个唯一索引
CREATE UNIQUE INDEX index_mytable_name ON mytable(name);

# 分析sql执行状况
EXPLAIN SELECT * FROM test WHERE MATCH(NAME) AGAINST('1')

对比说明: 数据量大的时候可创建索引

普通索引

这是最基本的索引类型,而且它没有唯一性之类的限制。
创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );
全文索引

MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在VARCHAR
或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。
对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。
复合索引

指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合
CREATE INDEX index_mytable_id_name ON mytable(id,name);
唯一索引

索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
CREATE UNIQUE INDEX index_mytable_name ON mytable(name);
  1. 七种JOIN理论
    在这里插入图片描述
  2. 索引是什么?有哪些?
帮助获取mysql高效的获取数据的数据结构

在这里插入图片描述
在这里插入图片描述

  1. BTree索引

4、explain结果的各字段意义说明

  • explain + sql语句;
    在这里插入图片描述
    在这里插入图片描述
    type:由最差到最好排序如下
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5、索引失效相关问题

  1. 常见索引失效的原因:
    在这里插入图片描述
    在这里插入图片描述

针对以上情况,逐个说明:
(1)全值匹配
在这里插入图片描述
(2)最佳左前缀
在这里插入图片描述
(8)like的%最好是在右边,如果必须两边都有%,还要索引有效,就得建立组合索引,且查询条件小于等于这个索引
在这里插入图片描述
在这里插入图片描述
(9)varchar类型加’’
在这里插入图片描述
在这里插入图片描述
小总结
在这里插入图片描述
在这里插入图片描述

6、索引面试题分析

在这里插入图片描述

7、Join调优案例:

sql调优整体步骤:
在这里插入图片描述

1. 单表sql调优

需求:
在这里插入图片描述
(1)explain此sql
在这里插入图片描述
发现它的type是ALL,Extra是Using filesort,这两个都需要优化
(2)对查询条件中使用到到字段建立组合索引
在这里插入图片描述
(3)此时type已经优化成range,但extra还是Using filesort
在这里插入图片描述
(4)虽然说此时三个条件都有索引,但是范围筛选之后的索引会失效,比如看一下下面的=和>对比
在这里插入图片描述
(5)所以,我们不需要对范围筛选的字段建立索引,否则会影响后面的索引
先删除之前建立的组合索引,再新建不带范围筛选字段的组合索引,此时可以看到type成了最优的ref,extra也成了Using Where
在这里插入图片描述
在这里插入图片描述

2. 双表sql调优

在这里插入图片描述
需求:优化下面sql
在这里插入图片描述
(1)执行结果:type有ALL
在这里插入图片描述
(2)book表创建索引card,再分析
在这里插入图片描述
在这里插入图片描述
(3)给class的card也加个索引,发现rows又成了20
在这里插入图片描述
(4)删除索引,重新建个索引
在这里插入图片描述

在这里插入图片描述

3. 三表sql优化

在双表的基础上再加一个phone,此时有book、class、phone三张表
在这里插入图片描述
需求:优化此sql
在这里插入图片描述
(1)给phone、book添加索引card,再explain一次看看
在这里插入图片描述
在这里插入图片描述
(2)结论:多表join的优化尽量达到小结果驱动大的结果集,比如此案例class类别表肯定没有book书表的数据多,就用class驱动book
在这里插入图片描述
在这里插入图片描述

8、Order By优化

  • 尽量使用index方式排序,避免使用filesort方式排序
  • 尽可能在索引列上完成排序操作,遵照索引建的最佳左前缀
  • 如果不在索引列上,filesort有两种算法:mysql要启动双路排序和单路排序
    在这里插入图片描述

9、Group By优化

  • group by 实际上是先排序再分组,遵从索引建的最佳左前缀
  • 当无法使用索引列,增大max_length_for_sort_data参数的设置+增大sort_buffer_size参数的设置
  • where高于having,能写在where限定的条件就不要去having限定了
  • 其他和order by一样

10、慢查询日志

在这里插入图片描述
在这里插入图片描述

1. 查看是否开启

在这里插入图片描述

2. 如何开启

在这里插入图片描述
如果要永久生效
在这里插入图片描述

3. 开启慢查询日志后,什么样的sql会被记录到慢查询日志里呢?

在这里插入图片描述
开启后再次查询,没有看到新设置的值,是因为需要重新连接一次

在这里插入图片描述

4. 将慢查询sql择出来进行分析优化

  • 方式一,去查看log文件
  • 方式二,借助工具mysqldumpslow(在mysql目录下自带的)
    在这里插入图片描述
    在这里插入图片描述

11、批量插入数据脚本

12、Show Profile

在这里插入图片描述

13、全局查询日志(只能在测试环境用)

在这里插入图片描述

14、数据库锁理论概述(表锁、行锁)

  • 表锁
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 行锁
    在这里插入图片描述
    在这里插入图片描述
    行锁优化建议
    在这里插入图片描述

15、事务相关知识复习

1. 什么是(ACID)?

在这里插入图片描述

2. 并发事务处理带来的问题

在这里插入图片描述

3. 事务的隔离级别

在这里插入图片描述

16、面试题:如何锁一行

在这里插入图片描述

17、主从复制

参考另一篇:windows和linux的MyCat使用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值