Skip to content

MySQL 基础面试题

MySQL语句类型有哪些?

  1. DDL(数据定义语言):定义和管理数据库对象,如CREATE、ALTER、DROP等
  2. DML(数据操作语言):操作数据库中的数据,如INSERT、UPDATE、DELETE等
  3. DQL(数据查询语言):查询数据库数据,如SELECT等
  4. DCL(数据控制语言):控制数据库访问权限,如GRANT、REVOKE等
  5. TCL(事务控制语言):如COMMIT、ROLLBACK等

CHAR和VARCHAR的区别?

  1. CHAR和VARCHAR类型在存储和检索方面有所不同
  2. CHAR列长度固定为创建表时声明的长度,长度值范围是1到255

当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。

主键索引与唯一索引的区别

  1. 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
  2. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
  3. 唯一性索引列允许空值,而主键列不允许为空值。
  4. 主键列在创建时,已经默认为空值 ++ 唯一索引了。
  5. 一个表最多只能创建一个主键,但可以创建多个唯一索引。
  6. 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
  7. 主键可以被其他表引用为外键,而唯一索引不能。

MySQL中有哪些不同的表格?

  • MyISAM
  • Heap
  • Merge
  • INNODB
  • ISAM

MyISAM和InnoDB的区别是什么

  1. 事务支持:MyISAM不支持事务,InnoDB支持事务
  2. 锁机制:MyISAM使用表级锁,InnoDB使用行级锁
  3. 索引结构:MyISAM的索引和数据分离,InnoDB的主键索引是聚集索引
  4. 缓存:MyISAM只缓存索引,InnoDB缓存索引和数据
  5. 外键支持:MyISAM不支持外键,InnoDB支持外键
  6. 崩溃恢复:MyISAM崩溃后恢复困难,InnoDB支持崩溃恢复
  7. 读写性能:MyISAM对读数据支持非常好,写操作时会锁定整个表
  8. 资源占用:MyISAM对系统资源占用小
  9. 并发支持:MyISAM读写阻塞互斥,不支持多用户并发写操作

什么是辅助索引和聚集索引?

  • 辅助索引:也称为非聚簇索引,叶子节点存储的是主键值而非数据行,查询时需要先找到主键值,再通过主键索引查找数据行
  • 聚集索引:也称为主键索引,数据行实际存储在索引的叶子节点,InnoDB引擎特有,查询效率高

数据库三大范式是什么

第一范式:每个列都不可以再拆分。

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。

列对比运算符是什么?

在SELECT语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符。

LIKE声明中的%和_是什么意思?

  • %对应于0个或更多字符,_只是LIKE语句中的一个字符

如何在Unix和MySQL时间戳之间进行转换

  • UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
  • FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令

UNION与UNION ALL的区别?

  1. Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
  2. Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
  3. UNION的效率高于 UNION ALL

索引的基本原理

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

  1. 把创建了索引的列的内容进行排序
  2. 对排序结果生成倒排表
  3. 在倒排表内容上拼上数据地址链
  4. 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

SQL 约束有哪几种呢?

  1. NOT NULL: 约束字段的内容一定不能为NULL。
  2. UNIQUE: 约束字段唯一性,一个表允许有多个 Unique 约束。
  3. PRIMARY KEY: 约束字段唯一,不可重复,一个表只允许存在一个。
  4. FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键。
  5. CHECK: 用于控制字段的值范围。

创建索引的三种方式

在执行CREATE TABLE时创建索引

sql
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
`sex` int(1) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

使用ALTER TABLE命令添加索引

sql
ALTER TABLE table_name ADD INDEX index_name (column);

使用CREATE INDEX命令创建

sql
CREATE INDEX index_name ON table_name (column);

MySQL 的常用引擎都有哪些?

答:MySQL 的常用引擎有 InnoDB、MyISAM、Memory 等,从 MySQL 5.5.5 版本开始 InnoDB 就成为了默认的存储引擎。

什么叫回表查询?

答:普通索引查询到主键索引后,回到主键索引树搜索的过程,我们称为回表查询。

如果把一个 InnoDB 表的主键删掉,是不是就没有主键了?

答:不是,如果把主键删掉了,那么 InnoDB 会自己生成一个长度为 6 字节的rowid 作为主键。

一张自增表中有三条数据,删除两条数据之后重启数据库,再新增一条数据,此时这条数据的 ID 是几?

答:无论是MySQL 8还是MySQL 5.7,在删除数据后重启数据库再新增数据时,新数据的ID不会被删除的记录影响,而是继续按照自增序列规则生成。

唯一索引和普通索引哪个性能更好?

答:唯一索引和普通索引的性能对比分为以下两种情况:

  • 对于查询来说两者都是从索引树进行查询,性能几乎没有任何区别;
  • 对于更新操作来说,因为唯一索引需要先将数据读取到内存,然后需要判断是否有冲突,因此比唯一索引要多了判断操作,从而性能就比普通索引性能要低。

left join 和 right join 的区别是什么?

  • left join 和 right join 的区别如下:
  • left join(左联结),返回左表全部记录和右表联结字段相等的记录;
  • right join(右联结),返回右表全部记录和左表联结字段相等的记录。

什么是最左匹配原则?它的生效原则有哪些?

答:最左匹配原则也叫最左前缀原则,是 MySQL 中的一个重要原则,指的是索引以最左边为起点任何连续的索引都能匹配上,当遇到范围查询(>、<、between、like)就会停止匹配。 生效原则来看以下示例,比如表中有一个联合索引字段 index(a,b,c):

  • where a=1 只使用了索引 a;
  • where a=1 and b=2 只使用了索引 a,b;
  • where a=1 and b=2 and c=3 使用 a,b,c;
  • where b=1 or where c=1 不使用索引;
  • where a=1 and c=3 只使用了索引 a;
  • where a=3 and b like 'xx%' and c=3 只使用了索引 a,b。

以下 or 查询有什么问题吗?该如何优化?

sql
select * from t where num=10 or num=20;

答:如果使用 or 查询会使 MySQL 放弃索引而全表扫描,可以改为:

sql
select * from t where num=10
union
select * from t where num=20;

事务是什么?它有什么特性?

答:事务是一系列的数据库操作,是数据库应用的基本单位。

在 MySQL 中只有 InnoDB 引擎支持事务,它的四个特性如下:

  • 原子性(Atomic),要么全部执行,要么全部不执行;
  • 一致性(Consistency),事务的执行使得数据库从一种正确状态转化为另一种正确状态;
  • 隔离性(Isolation),在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务;
  • 持久性(Durability),事务提交后,其结果永久保存在数据库中。

MySQL 中有几种事务隔离级别?分别是什么?

答:MySQL 中有四种事务隔离级别,分别是:

  • read uncommited,未提交读,读到未提交数据;
  • read committed,读已提交,也叫不可重复读,两次读取到的数据不一致;
  • repetable read,可重复读;
  • serializable,串行化,读写数据都会锁住整张表,数据操作不会出错,但并发性能极低,开发中很少用到。

MySQL 默认使用 repetable read 的事务隔离级别。

如何设置 MySQL 的事务隔离级别?

答:MySQL 事务隔离级别 mysql.cnf 文件里设置的(默认目录 /etc/my.cnf), 在文件的文末添加配置:

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLEREAD、SERIALIZABLE

MySQL 出现了中文乱码该如何解决?

答:解决 MySQL 中文乱码的问题,可以设置全局编码或设置某个数据库或表的编码为 utf8。 设置全局编码:

sql
set character_set_client='utf8';
set character_set_connection='utf8';
set character_set_results='utf8';

设置数据库的编码:

sql
alter database db character set utf8;

设置表的编码:

sql
alter table t character set utf8;

清空表的所有数据性能最好的语句是?

A:delete from t

B:delete t

C:drop table t

D:truncate table t

答:D

题目解析:truncate 清除表数据不会写日志,delete 要写日志,因此 truncate 的效率要高于 delete。

myisamchk是用来做什么的?

它用来压缩MyISAM表,这减少了磁盘或内存使用。

什么是数据库连接池?为什么需要数据库连接池呢?

连接池基本原理

数据库连接池原理:在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。

应用程序和数据库建立连接的过程

  1. 通过TCP协议的三次握手和数据库服务器建立连接
  2. 发送数据库用户账号密码,等待数据库验证用户身份
  3. 完成身份验证后,系统可以提交SQL语句到数据库执行
  4. 把连接关闭,TCP四次挥手告别。

数据库连接池好处

  1. 资源重用 (连接复用)
  2. 更快的系统响应速度
  3. 新的资源分配手段
  4. 统一的连接管理,避免数据库连接泄漏

按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法

  • 按锁粒度分有:表锁,页锁,行锁
  • 按锁机制分有:乐观锁,悲观锁

为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。