数据库面试题

David 2023-06-03 00:20:04
Categories: Tags:

myisam和innodb的区别

  1. myisam引擎是5.1版本之前的默认引擎,支持全文检索、压缩、空间函数等,但是不支持事务和行级锁,所以一般用于有大量查询少量插入的场景来使用,而且myisam不支持外键,并且索引和数据是分开存储的。
  2. innodb是基于聚簇索引建立的,和myisam相反它支持事务、外键,并且通过MVCC来支持高并发,索引和数据存储在一起。

    什么是覆盖索引和回表

  3. 覆盖索引指的是在一次查询中,如果一个索引包含或者说覆盖所有需要查询的字段的值,反之则回表查询。
  4. 一个查询是否是覆盖索引,我们只需要explain sql语句看Extra的结果是否是“Using index”即可。

drop、 delete与truncate的区别

  1. delete和truncate只删除表的数据不删除表的结构
  2. 速度: drop> truncate >delete
  3. delete 事务提交之后才回生效
  4. truncate,drop, 操作立即生效

    事务隔离级别有哪些?MySQL的默认隔离级别是?

隔离级别 脏读 不可重复读 幻影读
READ-UNCOMMITTED
READ-COMMITTED ×
REPEATABLE-READ × ×
SERIALIZABLE × × ×
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通 过 SELECT @@tx_isolation; 命令来查看

MySQL 中一条查询 SQL 是执行流程是怎样的?

  1. 取得链接,使用使用到 MySQL 中的连接器。
  2. 查询缓存 ,key 为 SQL 语句,value 为查询结果,如果查到就直接返回。不建议使用次缓存, 在 MySQL 8.0 版本已经将查询缓存删除,也就是说 MySQL 8.0 版本后不存在此功能。
  3. 分析器,分为词法分析和语法分析。此阶段只是做一些 SQL 解析,语法校验。所以一般语法错 误在此阶段。
  4. 优化器,是在表里有多个索引的时候,决定使用哪个索引;或者一个语句中存在多表关联的时 候(join),决定各个表的连接顺序。
  5. 执行器,通过分析器让 SQL 知道你要干啥,通过优化器知道该怎么做,于是开始执行语句。执 行语句的时候还要判断是否具备此权限,没有权限就直接返回提示没有权限的错误;有权限则 打开表,根据表的引擎定义,去使用这个引擎提供的接口,获取这个表的第一行,判断 id 是都
    等于 1。如果是,直接返回;如果不是继续调用引擎接口去下一行,重复相同的判断,直到取 到这个表的最后一行,最后返回。

    执行 SELECT COUNT(*) 在 InnoDB 比 MyISAM 快还是慢,为什么?

  6. MyISAM 内部有计数器更快
  7. InnoDB 实时查询慢

    索引的缺点有哪些?

  8. 索引需要占物理空间。
  9. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

    MySQL 数据库的锁有哪些?

  10. 共享锁:不堵塞,多个用户可以同一时刻读取同一个资源,相互之间没有影响。
  11. 排它锁:一个写操作阻塞其他的读锁和写锁,这样可以只允许一个用户进行写入,防止其他用 户读取正在写入的资源。
  12. 表锁:系统开销最小,会锁定整张表,MyISAM 使用表锁。
  13. 行锁:容易出现死锁,发生冲突概率低,并发高,InnoDB 支持行锁(必须有索引才能实现, 否则会自动锁全表,那么就不是行锁了)。

    B+树相对于B树的优势

  14. 每个节点存储更多的KEY,树的高度更低,时间复杂度越小,查询越快
  15. 数据在叶子节点,每次查询都要查询到叶子节点,查询速度比较稳定
  16. 叶子节点构成了链表结构,方便区间查询和排序

    Mysql为什么使用B+树

    以最小的IO找到更多的记录数,如果是B树,由于每个节点要存储Key和Value(数据) ,那么每个节点能存储的Key是很少的 ,而B+树每个节点只存储Key,它可以存储更多的Key, 每个节点存储的Key越多,路数越多,节点就越少,需要耗时的IO就越少,查找性能就越高 , 且B+树的叶子节点是有序的,形成链表,方便区间查询和排序。