mysql常考知识点_mysql进阶学习一之知识点总结

本文介绍了在CentOS7环境下安装MySQL5.7的步骤及可能遇到的问题,强调了执行引擎在数据库操作中的重要性。文章深入解析了MySQL的逻辑架构,包括缓存、优化器和执行引擎的工作原理,并探讨了如何通过优化SQL、合理使用索引来提升数据库性能。此外,还提到了避免索引失效的情况、子查询优化和排序分组的注意事项。最后,简述了MySQL主从复制的基本原理。
摘要由CSDN通过智能技术生成

环境:centos7+mysql5.7

1 mysql5.7的安装

这里使用yum安装,参考这个老哥的博客  ,反正我安装的时候一言难尽,重装了好几次,哎,平常自己玩的都是用的docker...

装好了记得根据上面的博客去初始化密码哦!

2 mysql的逻辑架构

mysql底层就是经过下面这几部分,我们要知道,执行引擎才是真正干活的;

可以发现这里运行了缓存,首先在缓存中取数据,缓存中能命中就直接从缓存中去,缓存中存数据是sql语句为键,实际的数据为值

例如:select name from stu where id = 1;  和select name from stu where id <2 and id>0  ,虽然两条sql在我们看来是一样的,但是不会命中缓存,因为sql不一样

28b04bd9c054f8194170f4dfc8bb76fe.png

在上图中第5步中的优化器Optimizer,会对我们执行的sql进行优化,例如我们写的sql格式如下:

0d5441a9bd61984da7a8c53dfa0a3a26.png

然后在优化器中可能就变成了下面这种(每次的优化都有可能不一样)

9e09e83ebc6fe7a554804556dc691607.png

可以看看mysql中有几种执行引擎:show engines;

默认的就是Innodb,从下面可以看到这个引擎支持事务,行锁和外键,一般还会说MyISAM的特点,就是不支持事务,不支持行锁(只支持表锁),不支持外键;

两个引擎还有一个不同就是,MyISAM只缓存索引,而InnoDb缓存索引和实际的数据;

那什么时候会使用MyISAM引擎呢?其实就是mysql自带的一些表会用这个引擎,因为不需要高并发嘛,一般也是管理员去修改一下,所以锁住整张表也无所谓;

1cc74313e85132d9238325a74f9544fc.png

3.性能

项目中mysql使用时间长了之后, 性能会下降,sql的执行时间变长,一般有几个原因

(1)sql中关联的表太多:比如有太多的join,我们需要对sql进行优化

(2)没有充分的利用索引: 看情况去建立索引

(3)数据量太多:sql的优化已经到了极致,数据量太多就需要进行分库分表

(4)mysql服务器参数调优:这个一般也不会去修改,主要是调整my.cnf文件

对sql进行优化,一般就是添加索引,我们一些情况需要添加索引:

(1)频繁的作为查询条件的字段

(2)与其他表作为关联的字段

(3)建立组合索引优于单键索引

(4)  排序语句中的字段加索引,因为索引是已经排序好了的,可以极大的提高排序速度

(5)分组的字段,因为group by是先做的order by,然后再进行的分组

不应该创建索引的字段:

(1)表的记录太少了

(2)经常进行增删改的字段,因为也需要对索引进行相应的操作

(3)where条件中用不到的字段

(4)区分度不高的字段,比如性别

4 explain查看执行计划

在mysql的逻辑架构图中的第5步会调用优化器Optimizer会生成执行计划,然后执行引擎就是根据这个执行计划去执行sql的;

explain命令就是查看这个执行计划的,用法就是sxplain+sql语句,示例: explain select * from stu where id = 0

我们可以根据执行计划看到:

(1)表的读取顺序

(2) 操作表的操作类型

(3)索引的使用情况

(4)表之间的引用

(5)每张表有多少行数据被查询

...

下面中框框中是比较重要的字段,要明白其中的含义才能更好的分析,想知道每个字段详细意思的,看看这个老哥的博客

319d87fb90a5ea8e1c3a32e608dd1ba4.png

5  索引失效

有的时候一些不规范的sql写法会导致明明新建了sql,但是没有走索引,常见的有这么几种情况:

(1)没有遵循最左匹配原则,比如索引是(a,b,c),但是你只使用了b,或者(b,c)

(2)对索引列使用了!=进行判断,xxx where age != 10

(3)使用了is not null   ,xxx where age is not null

(4)like模糊查询时百分号在前面,  xxx where age like '%8'

(5)字符串不加引号,比如xxx where name = 1  ,name建立了索引,而且那么是varchar类型的,此时索引会失效

(6)对索引列使用函数计算了 ,例如xxx where max(age) > 10

6 关联查询优化

(1)a left join b  : a是驱动表,a会全部扫描,b是被驱动表,b可以走索引

所以做连表查询的时候,数据少的做驱动表,数据多的建立索引,作为被驱动表,简称小表驱动大表

(2)a inner join b: mysql自己会将结果集小的作为驱动表,大的作为被驱动表

(3)子查询不要作为驱动表,可能用不到索引

(4)能关联的就直接关联查询,不要用子查询

7. 子查询优化

不要使用not in 或者not exists,使用改写sql写法,改成xxx a left join  b on xxx is null,这样会走索引

8 排序分组优化

(1)(a,b)是索引,xxx where a = 1 order by b会走索引

(2)尽量使用索引字段进行排序,必须要有limit关键字才会走索引

(3)order by a desc,b asc  :   一个降序,一个升序不会走索引

(4)order by a desc,desc : 走索引

9. 覆盖索引

select a,b from xxx

刚好(a,b)是索引,所以这个sql就会走索引查询数据直接返回,不会进行回表

10 mysql主从复制

原理如下:

c80fbe77d4c1065275f2957d610de531.png

分三步:

1.主节点master将增删改的sql记录到二进制日志文件(binary log)中

2.从节点slave的io线程将主节点的二进制日志文件拷贝到自己的中继日志文件(Replay log)中

3. 从节点又启动一个sql线程去读取中继日志,执行sql

一般主从节点是在不同的服务器中,可以知道主从节点经过了多次io操作,所以主从复制会有延迟的效果,比如你往数据库中插入一条数据,然后你去查询却查不到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值