MySQL 面试题(一)
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 -