目录

MySQL常见面试题

MySQL的字段类型

  • 主要分为三类:数值类型、字符串类型、日期类型
  • 数值类型包含:INT、BIGINT、SMALLINT、TINYINT、FLOAT、DOUBLE、DECIMAL等
  • 字符串类型包含:VARCHAR、CHAR、TEXT等
  • 日期类型包含:DATE、TIME、DATETIME、TIMESTAMP等

Unsigned的作用

  • Unsigned表示无符号,即只能存储非负数
  • 使用Unsigned的好处是可以将正数的存储上限提高一倍

VARCHAR和CHAR的区别

  • VARCHAR是可变长度字符串,CHAR是定长字符串
  • VARCHAR存储时会记录实际长度,CHAR会用空格填充到指定长度
  • VARCHAR适合存储长度不固定的字符串,CHAR适合存储长度固定的字符串

DECIMAL和FLOAT/DOUBLE的区别

  • DECIMAL是定点数,可以存储精确的小数
  • FLOAT/DOUBLE是浮点数,存储的是近似的小数

DATATIME和TIMESTAMP的区别

  • DATATIME存储的时间是不带时区的,并且只需要4字节即可
  • TIMESTAMP存储的时间是带市区的,需要8个字节才能存储

NULL和’‘的区别

  • NULL是一个缺失或者不确定的值,‘‘是一个空字符串,是确定的值。
  • NULL不能参与==、!=之类的运行,判断是否为NULL只能使用IS NULL或者IS NOT NULL。‘‘可以参与运算。
  • 大多数的聚合函数会忽略NULL,例如SUM、AVG,COUNT(*)时会统计包含NULL值的行,但是COUNT(列名)会忽略NULL值。但是空字符串会被聚合函数统计在内。

MySQL的基础架构

  • 客户端Client通过连接器进行认证等操作连接MySQL服务。
  • 接着执行一个SQL语句时会先去缓存查,存在缓存就直接返回(MySQL8.0之后默认关闭缓存)。
  • 如果没命中缓存会进入分析器,分析器会对SQL的正确性进行检查。
  • 接着会进入优化器对SQL进行优化。
  • 最后进入执行器执行SQL,操作存储引擎获取到数据。

存储引擎

  • MySQL是插拔式的存储引擎架构,支持多种存储引擎。
  • MySQL默认的存储引擎是InnoDB,在5.5版本之前默认的是MyIsAM存储引擎。

MyIsAM和InnoDB的区别

  • MyIsAM不支持行级锁,只支持表级锁。InnoDB支持行级锁也支持表级别锁。
  • MyIsAM不支持事务,InnoDB支持事务并实现了四种事务隔离机制。
  • MyIsAM不支持外键,InnoDB支持外键。
  • MyIsAM不支持服务崩溃后的安全恢复,InnoDB支持。
  • 索引不同,虽然MyIsAM和InnoDB使用的都是B+Tree树作为索引结构。但是二者的实现方式不同,MyIsAM索引文件和数据文件是分离的,而InnoDB数据文件本身就是索引文件。
  • MyIsAM的性能差一点,InnoDB的性能好。

MySQL索引

  • 索引是可以进行快速查询、检索数据的数据结构,本质上就是一个排好序的数据结构。
  • 索引的优点是查询数据快、可以确保唯一性、可以加速排序和分组。
  • 索引的缺点是需要占用额外的内存、插入删除数据时需要同时维护索引。
  • 不是用了索引就一定快。如果表的数据量很小,全表扫描会比使用索引更快。如果查询的结果集占全部数据的大部分,使用索引会快。

索引创建的条件

  • 经常作为查询条件的字段
  • 标的数据量较大
  • 查询的结果集占表数据的总量较少
  • 字段不会经常性更新
  • 字段类型是短字符串、数字等,最好不能是Text、Blob等类型

联合索引和最左前缀匹配原则

  • 联合索引是指在多个字段上创建索引,例如在字段a、b、c上创建索引,那个这个索引实际匹配的是a、ab、abc。
  • 最左前缀匹配就是查询条件必须包含联合索引最左边的查询字段才能使用索引。就比如查询a=1 and c=2时a可以使用索引,然后在结果集中筛选出c=2的数据,b=1、c=2都不可以使用索引,因为没有包含a、ab、abc三种情况。
  • b=1 and a=1 and c=2时,会优化成a=1 and b=1 and c=2,所以可以使用索引。

哪些情况下索引会失效

  • 使用!=、<>、not in、not exists等否定操作符
  • 使用IS NULL、IS NOT NULL
  • 使用函数或者表达式
  • 使用LIKE ‘%value%‘或者value%这种模式匹配
  • 使用OR连接查询条件
  • 使用复合索引时,查询条件不包含最左前缀

MySQL事务

  • 事务就是逻辑上的一组操作,要么全部成功,要么全部失败。

MySQL事务的四大特性

  • 原子性:事务是最小的单位,不可分割。
  • 隔离性:多个事务之间相互隔离的。
  • 持久性:一个事务执行成功后,他对数据库的改变是持久的。
  • 一致性:事务执行前后,数据的完整性约束没有被破坏。例如A向B转账100元,他们二者的账户余额之和在事务执行前后是不变的。
  • 只有确保原子性、隔离性、持久性才能保证一致性.

并发事务会带来哪些问题

  • 脏读:一个事务读取了另外一个未提交事务修改后的数据。
  • 幻读:一个事务在读取一些数据时,另外一个事务插入了一些数据并提交导致两次读到的数据不一致。
  • 不可重复读:一个事务在读取一条数据时,另外一个事务对该数据进行了修改并提交,导致两次读取到的数据不一样。
  • 丢失修改:一个事务修改了数据,但是另一个事务也修改了数据导致第一个事务的修改丢失.

并发事务的控制方法

  • 加锁,一般分为共享锁和排他锁。共享锁允许多个事务同时读取数据,排他锁只允许一个事务读取、修改数据。
  • 调整事务隔离机制,MySQL有四种事务隔离机制:
    • Read UnCommitted:读取未提交,允许访问事务修改并且未提交的数据,可能会出现脏读、幻读和不可重复读
    • Read Committed:读取已提交,只能读取到已经提交的事务修改的数据,解决了脏读问题,但还是可能会出现幻读和不可重复读
    • Repeatable Read:可重复读,对同一数据的多次读取结果是一样的,除非是事务自己修改数据,可以解决脏读和不可重复读,当时仍然可能出现幻读,是MySQL默认事务隔离机制。
    • Serialable: 串行化,最高级别的事务隔离机制,只允许事务按顺序执行,避免了所有的并发问题。