1. 数据库三范式是什么
第一范式: 字段具有原子性, 不可再分. (所有关系型数据库系统都满足第一范式数据库表中的字段都是单一属性, 不可再分)
第二范式: 是在第一范式基础上建立起来的, 即满足第二范式必须先满足第一范式. 要求数据库表中的每个实例或行必须可以被唯一区分. 通常需要为表上一个列, 以储存各个实例的唯一标识. 这个唯一属性列为主关键字或主键.
第三范式: 必须先满足第二范式. 简而言之, 第三范式要求一个数据库表不包含在其他表中已包含的非主关键字信息.
所以三范式具有以下特性:
每个列只有一个值.
每一行都能区分.
每一个表都不包含其他表已经包含的非主关键字信息
2. 请简述常用的索引有哪些种类
普通索引: 即针对数据库表创建索引
唯一索引: 与普通索引类似, 不同的是: MySQL 数据库索引列的值必须唯一, 但允许空值
主键索引: 它是一种特殊的唯一索引, 不允许有空值. 一般是在建表的时候同时创建主键索引
组合索引: 为了进一步榨取 MySQL 的效率, 就要考虑建立组合索引. 即将数据库表中的多个字段联合起来作为一个组合索引.
3. MySQL 的基础操作命令
MySQL 是否处于运行状态: Debian 上运行命令 service mysql status, 在 RedHat 上运行命令 service mysqld status
开启或停止 MySQL 服务: 运行命令 service mysqld start 开启服务: 运行命令 service mysqld stop 停止服务
Shell 登入 MySQL : 运行命令 mysql -u root -p
4. MySQL 的复制原理及流程
MySQL 内键的复制功能是构建大型、 高性能应用程序的基础. 将 MySQL 的数据分布到多个系统上去, 这种分布的机制, 是通过将 MySQL 的某一台主机的数据复制到其他主机(slaves) 上, 并重新执行一遍来实现的. * 复制过程中一个服务器充当主服务器, 而一个或多个其他服务器充当从服务器. 主服务器将更新写入二进制日志文件, 并维护文件的一个索引以跟踪日志循环. 这些日志可以记录发生到从服务器的更新. 当一个从服务器连接主服务器时, 它通知主服务器在日志中读取的最后一次成功的更新的位置. 从服务器接受从那时起发生的任何更新, 然后封锁并等待主服务器通知新的更新.
过程如下
- 主服务器把更新记录到二进制日志文件中
- 从服务器把主服务器的二进制日志拷贝到自己的中继日志(replay log)中
- 从服务器重做中继日志中的时间, 把更新应用到自己的数据库上
5. MySQL 支持的复制类型
- 基于语句的复制: 在服务器上执行的 SQL语句, 在从服务器上执行同样的语句. MySQL 默认采用基于语句的复制, 效率比较高.
- 基于行的复制: 把改变的内容复制过去, 而不是把命令在从服务器上执行一遍, 从 MySQL5.0 开始支持
- 混合类型的复制: 默认采用基于语句的复制, 一旦发现基于语句的无法精准的复制时, 就会采用基于行的复制
6. MySQL 中 MyISAM 与InnoDB的区别
- MyISAM 强调的是性能, 每次查询具有原子性, 其执行速度比 InnoDB 类型更快, 但是不能提供事务支持. InnoDB 提供事务支持, 外部键等高级数据库功能. 具有事务, 回滚和崩溃修复能力的事务安全型表
- InnoDB 支持行级锁, 而 MyiSAM 支持表计锁. 用户在操作 MyISAM表时, select, update, delete, insert 语句都会给表自动加锁, 如果加锁以后得表满足 insert 并发的情况下, 可以在表的尾部插入新的数据
- InnoDB 支持 MVCC, 而 MyISAM 不支持
- InnoDB 支持外键, 而 MyISAM 不支持
- 表主键: MyISAM 允许没有任何索引和主键的表存在, 索引都是保存行的地址. InnoDB 如果,没有设定主键或者非空唯一索引, 就会自动生成一个6字节的主键.
- InnodDB 不支持全文索引, 而 MyISAM 支持
- 可移植性, 备份及回复: MyISAM 数据是以文件的形式存储, 所以在跨平台的数据转移中会很方便. 在备份和恢复时可单独针对某个表进行操作. InnoDB 拷贝的方案可以使拷贝数据文件, 备份 binlog. 或者 mysqldump, 在数据量达到几十G的时候就相对痛苦了
- 存储结构: 每个 MyISAM 在磁盘上存储成三个文件. 第一个文件的名字以表的名字开始, 扩展名指出文件类型. .frm文件存储表定义. 数据文件扩展名为 .MYD. 索引文件的扩展名为 MYI. InnoDB 表的大小只受限于操作系统文件的大小, 一般为 2GB
7. MySQL中 InnoDB 引擎的行锁是通过加在什么上完成(实现)的
InnoDB 行锁是通过给索引上的索引项加锁来实现的, 这一点 MySQL 与 Oracle 不同, 后者是通过在数据块中对相应数据加锁来实现的. InnodDB 这种行锁实现特点意味着: 只能通过索引条件检索数据.
8. 若一张表中只有一个字段 VARCHAR(N) 类型, utf8 编码, 则 N 最大值为多少?
由于 uft8 的每个字段最多占用3个字节, 而 MySQL 定义行的长度不能超过 65535, 因此 N 的最大值子算方法为: (65535 - 1 - 2) / 3. 减去1是因为实际储存是从第二个字节开始的, 减去2的原因是因为在列表长度存储实际的字符长度.
9. [SELECT *] 和 [SELECT 全部字段] 的2种写法有何优缺点
- 前者要解析数据字典, 后者不需要
- 结果输出顺序, 前者与建表列顺序相同, 后者需要改
- 表字段改名, 前者不需要修改, 后者需要修改
- 后者可以建立索引进行优化, 前者无法优化
- 后者的可读性比前者高
10. HAVING 字句和 WHERE 的异同点
- 语法上, where 用表中列名, having 用 select 结果别名
- 影响结果范围: where 从表读出数据的行数, having 返回客户端的行数
- 索引: where 可以使用索引, having 不能使用索引, 只能在临时结果集操作
- where 后面不能使用聚集函数, having是专门使用聚集函数的