本文已参与「新人创作礼」活动,一起开启掘金创作之路。
MySQL 面试题(一)
基础知识
三大范式
- 第一范式:每个列都不可再拆分
- 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分
- 第三范式:在第二范式的基础上,非主键列只依赖与主键,不依赖于其他非主键
MySQL 有关权限的表
- 这些表由
mysql_install_db脚本初始化 user权限表:记录允许连接到服务器的用户账号,权限是全局级的db权限表:记录各个账号在各个数据库上的操作权限table_priv权限表:记录数据表级的操作权限cloumns_priv权限表:记录数据列级的操作权限host权限表:配合 db权限表对给定主机上数据库级操作权限更细致的控制,该权限表不受 GRANT 和 REVOKE 语句的影响
MySQL 的 binlog 有几种录入格式以及区别
声明:在新版的 MySQL 中对 row 级别以及做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。
statement 模式下,每一条会修改数据的 sql 都会记录在 binlog 中,而且不会记录每一行的变化,减少了日志量,节约了 I/O,提高性能。由于 sql 执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制row模式下,不记录 sql 语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于存在很多操作,会导致大量行的改动(比如 alter table) ,因此这种模式的文件保存的信息太多,日志量太大mixed模式下,这是一种折中方案,普通操作使用 statement 记录,当无法使用 statement 的时候使用 row
常用函数
- count():返回行数
- sum():指定列求和
- max():指定列或表达式最大值
- min():指定列或表达式最小值
- avg():指定列或表达式平均值
- date():指定表达式代表的日期值
数据类型
略
存储引擎 MyISAM 与 InnoDB 区别
-
存储结构方面
- MyISAM 每张表被存放在三个文件:frm-表格定义、MYData-数据文件、MYIndex-索引文件
- InnoDB 所有的表都存放在独立的表空间文件中,表大小受限于操作系统文件的大小
-
存储空间
- MyISAM 可被压缩,存储空间较小
- InnoDB 的表需要更多的内存和存储,因为它会在主内存中建立其专用的缓冲池用户高速缓冲数据和索引
-
文件格式
- MyISAM 数据和索引时分别存储的,数据是MYD、索引是MYI
- InnoDB 数据和索引是集中存储的 xxx.ibd
-
外键和事务
- MyISAM 不支持
- InnoDB 支持
-
锁支持
- MyISAM 表级锁定
- InnoDB 行级、表级都可,锁定力度小并发能力高
-
可移植性、备份与恢复
- MyISAM 的数据以文件的形式存储,跨平台转移比较方便
- InnoDB 可拷贝数据文件、备份 binlog 或者 mysqldump
-
查询/更新
- MyISAM 查询更优,因为内部维护了一个计数器,可直接调用
- InnoDB 修改更优
-
索引实现方式
- MyISAM B+树索引,堆表,不支持哈希索引,支持全文索引
- InnoDB B+树索引,索引组织表,支持哈希索引
MyISAM 索引和 InnoDB 索引的区别
- MyISAM 索引是非聚簇索引,InnoDB 索引是聚簇索引
- MyISAM 索引的叶子节点存储的是行数据地址,还需再寻址一次才能得到数据
- InnoDB 的主键索引的叶子节点存储着行数据,因此主键索引非常高效
- InnoDB 非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效
InnoDB 引擎的4大特性
-
插入缓冲(insert buffer)
-
二次写(double write)
-
自适应哈希索引(ahi)
-
预读(read ahead)
-
END -