mysql优化-Explain工具介绍

explain可以模拟优化区,分析查询语句的性能瓶颈。
加上该关键字都只是返回了执行计划的信息,而不是执行SQL语句,当然子查询还是会执行。

explain中的关键列作出以下解释

1.ID:查询语句的编号,编号越大,执行的优先级越高,相同编号大小自上而下执行

2.select_type:查询的的复杂度;
有以下几个类型:simple 简单的查询,没有子查询和union

								derived:from后的子查询,mysql将其生成一个临时表(优先级最高)		
								subquery:from前的子查询,也就是查询字段(优先级次之)
								primary:复杂的查询当中,最外层的select查询语句		

3.table:访问哪一张表

4.type:很重要,表示该查询将如何去查找数据,次高到低的顺序
const,system:就像是在差一个常量或者只有一条数据一样那么丝滑。用于primarykey或uniquekey一条记录 :select*fromfilmwhereid=1

eq_ref:关联查询时,用primarykey或uniquekey作为关联条件,

ref:相比eq_ref,不适用主键或唯一键,使用不同的二级索引作为条件。

range:范围扫描通常出现在in(),between,>,<,>=等操作中。使用一个索引来检索给定范围的行。

index:扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。 >explain select * from film;
ALL:即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。explain select * from actor;

5.possible_keys列这一列显示查询可能使用哪些索引来查找。

6.key列这一列显示mysql实际采用哪个索引来优化对该表的访问。

索引优化:
1.一直都说最左前缀原则,不仅仅在where后要遵守,order by ,group by 都要遵守
2.很多时候我们业务系统实现分页功能可能会用如下sql实现select * from employees limit 10000,10;表示从表employees中取出从10001行开始的10行记录。看似只查询了10条记录,实际这条SQL是先读取10010条记录,然后抛弃前10000条记录,然后读到后面10条想要的数据。因此要查询一张大表比较靠后的数据,执行效率是非常低的。
有些时候我们通过inner join 优化,可以优化查询
select * frome mployeese edone inner join (select id frome mployees ed order by name limit 90000,5) edone.id=ed.id;
如果你直接查询select * frome mployees order by name limit 90000,5,虽然name有索引,但是可能数据太多,回表查询会带来很大新能消耗,我们就可以选择,先把他的id查出来这里的临时表会用到索引name,而且最主要的是,最外层左边会用到主键id索引。
3.in和exists优化原则:小表驱动大表,即小的数据集驱动大的数据集in:当B表的数据集小于A表的数据集时,in优于exists
当A表的数据集小于B表的数据集时,exists优于in将主查询A的数据,放到子查询B中做条件验证,根据验证结果(true或false)来决定主查询的数据是否保留
4.1、查询mysql自己维护的总行数对于myisam存储引擎的表做不带where条件的count查询性能是很高的,因为myisam存储引擎的表的总行数会被mysql存储在磁盘上,查询不需要计算

下面链接是锁机制https://mind.airmore.cn/doc/93a3370167
锁详解
锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除了传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供需要用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。
锁分类
从性能上分为乐观锁(用版本对比来实现)和悲观锁
从对数据库操作的类型分,分为读锁和写锁(都属于悲观锁)读锁(共享锁,S锁(Shared)):针对同一份数据,多个读操作可以同时进行而不会互相影响写锁(排它锁,X锁(eXclusive)):当前写操作没有完成前,它会阻断其他写锁和读锁
从对数据操作的粒度分,分为表锁和行锁表锁每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

表锁
每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。

行锁
每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。InnoDB与MYISAM的最大不同有两点:InnoDB支持事务(TRANSACTION)InnoDB支持行级

总结:MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。

锁优化建议
尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围尽可能减少检索条件范围,避免间隙锁
尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
尽可能低级别事务隔离

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值