MySQL 基础面试题
MySQL语句类型有哪些?
- DDL(数据定义语言):定义和管理数据库对象,如CREATE、ALTER、DROP等
- DML(数据操作语言):操作数据库中的数据,如INSERT、UPDATE、DELETE等
- DQL(数据查询语言):查询数据库数据,如SELECT等
- DCL(数据控制语言):控制数据库访问权限,如GRANT、REVOKE等
- TCL(事务控制语言):如COMMIT、ROLLBACK等
CHAR和VARCHAR的区别?
- CHAR和VARCHAR类型在存储和检索方面有所不同
- CHAR列长度固定为创建表时声明的长度,长度值范围是1到255
当CHAR值被存储时,它们被用空格填充到特定长度,检索CHAR值时需删除尾随空格。
主键索引与唯一索引的区别
- 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的。
- 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键。
- 唯一性索引列允许空值,而主键列不允许为空值。
- 主键列在创建时,已经默认为空值 ++ 唯一索引了。
- 一个表最多只能创建一个主键,但可以创建多个唯一索引。
- 主键更适合那些不容易更改的唯一标识,如自动递增列、身份证号等。
- 主键可以被其他表引用为外键,而唯一索引不能。
MySQL中有哪些不同的表格?
- MyISAM
- Heap
- Merge
- INNODB
- ISAM
MyISAM和InnoDB的区别是什么
- 事务支持:MyISAM不支持事务,InnoDB支持事务
- 锁机制:MyISAM使用表级锁,InnoDB使用行级锁
- 索引结构:MyISAM的索引和数据分离,InnoDB的主键索引是聚集索引
- 缓存:MyISAM只缓存索引,InnoDB缓存索引和数据
- 外键支持:MyISAM不支持外键,InnoDB支持外键
- 崩溃恢复:MyISAM崩溃后恢复困难,InnoDB支持崩溃恢复
- 读写性能:MyISAM对读数据支持非常好,写操作时会锁定整个表
- 资源占用:MyISAM对系统资源占用小
- 并发支持:MyISAM读写阻塞互斥,不支持多用户并发写操作
什么是辅助索引和聚集索引?
- 辅助索引:也称为非聚簇索引,叶子节点存储的是主键值而非数据行,查询时需要先找到主键值,再通过主键索引查找数据行
- 聚集索引:也称为主键索引,数据行实际存储在索引的叶子节点,InnoDB引擎特有,查询效率高
数据库三大范式是什么
第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。
列对比运算符是什么?
在SELECT语句的列比较中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE运算符。
LIKE声明中的%和_是什么意思?
- %对应于0个或更多字符,_只是LIKE语句中的一个字符
如何在Unix和MySQL时间戳之间进行转换
- UNIX_TIMESTAMP是从MySQL时间戳转换为Unix时间戳的命令
- FROM_UNIXTIME是从Unix时间戳转换为MySQL时间戳的命令
UNION与UNION ALL的区别?
- Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
- Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
- UNION的效率高于 UNION ALL
索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理很简单,就是把无序的数据变成有序的查询
- 把创建了索引的列的内容进行排序
- 对排序结果生成倒排表
- 在倒排表内容上拼上数据地址链
- 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
SQL 约束有哪几种呢?
- NOT NULL: 约束字段的内容一定不能为NULL。
- UNIQUE: 约束字段唯一性,一个表允许有多个 Unique 约束。
- PRIMARY KEY: 约束字段唯一,不可重复,一个表只允许存在一个。
- FOREIGN KEY: 用于预防破坏表之间连接的动作,也能防止非法数据插入外键。
- CHECK: 用于控制字段的值范围。
创建索引的三种方式
在执行CREATE TABLE时创建索引
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命令添加索引
ALTER TABLE table_name ADD INDEX index_name (column);使用CREATE INDEX命令创建
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 查询有什么问题吗?该如何优化?
select * from t where num=10 or num=20;答:如果使用 or 查询会使 MySQL 放弃索引而全表扫描,可以改为:
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。 设置全局编码:
set character_set_client='utf8';
set character_set_connection='utf8';
set character_set_results='utf8';设置数据库的编码:
alter database db character set utf8;设置表的编码:
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表,这减少了磁盘或内存使用。
什么是数据库连接池?为什么需要数据库连接池呢?
连接池基本原理:
数据库连接池原理:在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。
应用程序和数据库建立连接的过程:
- 通过TCP协议的三次握手和数据库服务器建立连接
- 发送数据库用户账号密码,等待数据库验证用户身份
- 完成身份验证后,系统可以提交SQL语句到数据库执行
- 把连接关闭,TCP四次挥手告别。
数据库连接池好处:
- 资源重用 (连接复用)
- 更快的系统响应速度
- 新的资源分配手段
- 统一的连接管理,避免数据库连接泄漏
按照锁的粒度分,数据库锁有哪些呢?锁机制与InnoDB锁算法
- 按锁粒度分有:表锁,页锁,行锁
- 按锁机制分有:乐观锁,悲观锁
为什么官方建议使用自增长主键作为索引?
结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。
