Mysql高级面试题整理(一)

1,088 阅读4分钟

「这是我参与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)+ 表中只有一个
    • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    • 全文索引:对文本的内容进行分词,进行搜索
  • 索引的优点

    提高数据的搜索速度 加快表与表之间的连接速度 在信息检索过程中,若使用分组及排序子句进行时,通过建立索引能有 效的减少检索过程中所需的分组及排序时间,提高检索效率。

  • 索引的缺点

    在我们建立数据库的时候,需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加。 在创建索引的时候会占用存储空间。 在我们需要修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。