「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」。0. ## mysql explain是什么?有什么作用?描述下type
1. mysql explain是什么?有什么作用?描述一下type
explain(执行计划),使用explain关键字可以模拟优化器执行sql查询语句,从而知道MySQL是如何处理sql语句。explain主要用于分析查询语句或表结构的性能瓶颈。从而提高数据检索效率,降低数据库的IO成本。
explain的作用
通过explain+sql语句可以知道如下内容:
①表的读取顺序。(对应id)
②数据读取操作的操作类型。(对应select_type)
③哪些索引可以使用。(对应possible_keys)
④哪些索引被实际使用。(对应key)
⑤表直接的引用。(对应ref)
⑥每张表有多少行被优化器查询。(对应rows)
描述type:重要的列,显示如何执行sql语句去表里查找记录的。从最好到最差的类型为:
const、eq_reg 、ref、range 、index 、all
2. 表锁、行锁、页锁区别?
- 表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度最低
- 行锁:开销大,加锁慢;会出现死锁;锁定力度小,发生锁冲突的概率低,并发度高
- 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般
3. 悲观锁 for update 乐观锁(version) 的区别
悲观锁:就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁
乐观锁:就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量
选择哪种锁:两种锁各有优缺点
- 乐观锁适用于写比较少的情况,即冲突真的很少发生的时候,这样省去了锁的开销,加大了系统的整个吞吐量
- 如果经常产生冲突,上层应用会不断的进行retry,这样会降低了性能,所以这种情况下用悲观锁就比较合适
4. 什么是索引?索引的种类有哪些,描述索引的优缺点?
-
索引
就像是书的目录,是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL可以快速有效地查找与键值关联的行。
-
索引种类
- 普通索引:仅加速查询
- 唯一索引:加速查询 + 列值唯一(可以有null)
- 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
- 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
- 全文索引:对文本的内容进行分词,进行搜索
-
索引的优点
提高数据的搜索速度 加快表与表之间的连接速度 在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有 效的减少检索过程中所需的分组及排序时间,提高检索效率。
-
索引的缺点
在我们建立数据库的时候,需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加。 在创建索引的时候会占用存储空间。 在我们需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。