当前位置:伍佰目录 » 站长资讯 » 免费资源 » 技术文章 » 文章详细

面试题系列:Mysql 夺命连环13问

来源:本站原创 浏览:312次 时间:2021-05-09

天涯论坛情感,月咏几斗吧,新炊间黄粱

  

  1. 能说下 myisam 和 innodb 的区别吗?

  myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。

  innodb是基于聚簇索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存储在一起。

  2. 说下 mysql 的索引有哪些吧,聚簇和非聚簇索引又是什么?

  索引按照数据结构来说主要包含B+树和Hash索引。

  假设我们有张表,结构如下:

  create table user(id int(11) not null,age int(11) not null,primary key(id),key(age));

  B+树是左小右大的顺序存储结构,节点只包含id索引列,而叶子节点包含索引列和数据,这种数据和索引在一起存储的索引方式叫做聚簇索引,一张表只能有一个聚簇索引。假设没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有的话则会隐式定义一个主键作为聚簇索引。

  

  这是主键聚簇索引存储的结构,那么非聚簇索引的结构是什么样子呢?非聚簇索引(二级索引)保存的是主键id值,这一点和myisam保存的是数据地址是不同的。

  

  最终,我们一张图看看InnoDB和Myisam聚簇和非聚簇索引的区别

  

  3. 那你知道什么是覆盖索引和回表吗?

  覆盖索引指的是在一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为覆盖索引,而不再需要回表查询。

  而要确定一个查询是否是覆盖索引,我们只需要explain sql语句看Extra的结果是否是“Using index”即可。

  以上面的user表来举例,我们再增加一个name字段,然后做一些查询试试。

  explain select * from user where age=1; https://www.3tt.net/?mod=artinfo&aid=286//查询的name无法从索引数据获取explain select id,age from user where age=1; //可以直接从索引获取

  4. 锁的类型有哪些呢

  mysql锁分为共享锁和排他锁,也叫做读锁和写锁。

  读锁是共享的,可以通过lock in share mode实现,这时候只能读不能写。

  写锁是排他的,它会阻塞其他的写锁和读锁。从颗粒度来区分,可以分为表锁和行锁两种。

  表锁会锁定整张表并且阻塞其他用户对该表的所有读写操作,比如alter修改表结构的时候会锁表。

  行锁又可以分为乐观锁和悲观锁,悲观锁可以通过for update实现,乐观锁则通过版本号实现。

  5. 你能说下事务的基本特性和隔离级别吗?

  事务基本特性ACID分别是:

  原子性指的是一个事务中的操作要么全部成功,要么全部失败。

本文地址:http://www.reviewcode.cn/youxikaifa/207188.html 转载请注明出处!


伍佰目录声明:本站部分文章来源于网络,版权属于原作者所有。如有转载或引用文章/图片涉及版权问题,请联系我们处理.我们将在第一时间删除! 联系邮箱:tsk@qq.com

快速链接

最新收录

最新点入