MySQL常见面试题汇总(建议收藏!!!)

目录

    • 一、索引相关
      • (1)什么是索引?
      • (2)索引是个什么样的数据结构呢?
      • (3)为什么使用索引?
      • (4)Innodb为什么要用自增id作为主键?
      • (5)Hash 索引和 B+ 树索引有什么区别或者说优劣呢?
      • (6)什么是聚簇索引
      • (7)说一说索引的底层实现?
      • (8)索引有哪些优缺点?
      • (9)聚簇索引和非聚簇索引的区别
      • (10)MyISAM和InnoDB实现B+树索引方式的区别是什么?
      • (11)MySQL中有几种索引类型,可以简单说说吗?
      • (12)覆盖索引是什么?
      • (13)非聚簇索引一定会回表查询吗?
      • (14)联合索引是什么?为什么需要注意联合索引中的顺序?
      • (15)创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
      • (16)那么在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?
      • (17)为什么Mysql用B+树做索引而不用B-树或红黑树、二叉树
      • (18)MySQL索引种类
      • (19)索引在什么情况下遵循最左前缀的规则?
    • 二、事务相关
      • (1)什么是事务?
      • (2)ACID是什么?可以详细说一下吗?
      • (3)MySQL中为什么要有事务回滚机制?
      • (4)数据库并发事务会带来哪些问题?
      • (5)怎么解决这些问题呢?MySQL 的事务隔离级别了解吗?
      • (6)Innodb使用的是哪种隔离级别呢?
      • (7)不可重复读和幻读区别是什么?可以举个例子吗?
    • 三、锁相关
      • (1)对 MySQL 的锁了解吗?
      • (2)MySQL 锁的分类
      • (3)行级锁、表级锁、页级锁的描述与特点
      • (4)共享锁 、 排他锁的描述
      • (5)悲观锁与乐观锁
      • (6)数据库悲观锁和乐观锁的原理和应用场景分别有什么?
      • (7)MySQL常用存储引擎的锁机制?
      • (8)InnoDB 存储引擎有几种锁算法?
      • (9)什么是死锁?
      • (10)死锁出现的案列?
      • (11)如何处理死锁?
      • (12)如何避免死锁?
      • (13)Innodb默认是如何对待死锁的?
      • (14)如何开启死锁检测?
      • (15)什么是全局锁?它的应用场景有哪些?
      • (16)使用全局锁会导致的问题?
      • (17)优化锁方面你有什么建议?
    • 四、存储引擎相关
      • (1)MySQL 支持哪些存储引擎?
      • (2)InnoDB 和 MyISAM 有什么区别?
      • (3)你了解MySQL的内部构造吗?一般可以分为哪两个部分?
      • (4)说一下MySQL是如何执行一条SQL的?具体步骤有哪些?
      • (5)SQL 的执行顺序?
      • (6)简述触发器、函数、视图、存储过程?
      • (6)听说过视图吗?那游标呢?
      • (6)视图的作用是什么?可以更改吗?
    • 五、表结构相关
      • (1)为什么要尽量设定一个主键?
      • (2)主键使用自增 ID 还是 UUID?
      • (3)字段为什么要求定义为not null?
      • (4)如果要存储用户的密码散列,应该使用什么字段进行存储?
      • (5)说一说Drop、Delete与Truncate的共同点和区别?
      • (6)数据库中的主键、超键、候选键、外键是什么?
    • 六、其他问题
      • (1)MySQL 中的 varchar 和 char 有什么区别?
      • (2)varchar(10) 和 int(10) 代表什么含义?
      • (3)MySQL的binlog有有几种录入格式?分别有什么区别?
      • (4)超大分页怎么处理?
      • (5)说一说三个范式?
      • (6)left join、right join以及inner join的区别?
      • (7)什么是数据库约束,常见的约束有哪几种?
      • (8)什么是sql注入?
      • (9)简述数据库的读写分离?
      • (10)MySQL数据库cpu飙升的话,要怎么处理呢?
      • (11)MYSQL的主从延迟,你怎么解决?
      • (12)如果让你做分库与分表的设计,简单说说你会怎么做?
      • (13)count(1)、count(*)与count(列名)的执行区别
      • (14)sql 语句中where 1=1的作用
      • (15)sql中null与空值的区别
    • 七、优化相关
      • (1)日常工作中你是怎么优化SQL的?
        • (1.1)表结构优化
        • (1.2)查询优化
        • (1.3)索引优化
        • (1.4)慢查询优化

一、索引相关

(1)什么是索引

索引是一种数据结构,可以帮助我们快速的进行数据的查找。

(2)索引是个什么样的数据结构呢

索引的数据结构和具体存储引擎的实现有关,在 MySQL 中使用较多的索引有 Hash 索引,B+ 树索引等,而我们经常使用的 InnoDB 存储引擎的默认索引实现为:B+ 树索引。

(3)为什么使用索引?

  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 帮助服务器避免排序和临时表。
  • 将随机IO变为顺序IO。
  • 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。

(4)Innodb为什么要用自增id作为主键?

如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。

(5)Hash 索引和 B+ 树索引有什么区别或者说优劣呢

首先要知道 Hash 索引和 B+ 树索引的底层实现原理:

hash 索引底层就是 hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+ 树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。

那么可以看出他们有以下的不同:

  • hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
    因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而 B+ 树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
  • hash 索引不支持使用索引进行排序,原理同上。
  • hash 索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为 hash 函数的不可预测。
  • hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询
  • hash 索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差。而 B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

因此,在大多数情况下,直接选择 B+ 树索引可以获得稳定且较好的查询速度。而不需要使用 hash 索引。

(6)什么是聚簇索引

聚簇索引就是按照每张表的 主键 构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据。

在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则MySQL自动为InnoDB表生成一个隐含字段来建立聚簇索引,这个字段长度为6个字节,类型为长整形。

当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

(7)说一说索引的底层实现?

你可能感兴趣的:(面试,学习路线,阿里巴巴,android,前端,后端)