来源于网络
1.分别说一下范式和反范式的优缺点
1.范式
减少数据冗余
表中重复数据较少,更新操作比较快
范式化的表通常比反范式化的表小
在查询的时候通常需要很多的关联,降低性能
增加了索引优化的难度
2.反范式
可以减少表的关联
更好的进行索引优化
数据重复冗余
对数据表的修改需要更多的成本
2.B+ 树和 B 树的区别
3.聚簇索引和非聚簇索引
- 聚簇索引,又叫主键索引,每个表只有一个主键索引,叶子节点保存主键的值和数据
- 非聚簇索引,又叫辅助索引,叶子节点保存索引字段的值和主键的值
4.Mysql 什么情况会造成脏读、不可重复读、幻读?如何解决
- 脏读:有两个事务A和B,A读取已经被B修改但未提交的字段,此时B回滚,那么A读取的字段就是临时且无效的。可以提高隔离级别,改成读已提交
- 不可重复读: 有两个事务A和B,A读取了一个字段值,然后B更新并且提交事务,A再重新读取这个字段,就和之前不相等了。可以提高隔离级别,改成可重复读
- 幻读: 有两个事务A和B,A读取某个范围内的记录时,B又在该范围内插入了新的记录并提交,当事务A再次读取该范围的记录时,会产生幻行。可以升级隔离级别到串行化,或者使用 MVCC + next-key锁机制实现
5.Mysql 事务是如何实现的
原子性:通过undo log实现的。每条数据变更都伴随一条undo log日志的生成,当系统发生错误或执行回滚根据undo log做逆向操作
持久性:通过redo log实现的。redo log记录了数据的修改日志。数据持久化到磁盘,先是储存到缓冲池里,然后缓冲池中的数据定期同步到磁盘中,如果系统宕机,可能会丢失数据,系统重启后会读取redo log恢复数据
隔离性:mysql数据库通过MVCC + next-key机制实现了隔离性
一致性:以上3大特性,保障了事务的一致性
6.Innodb 和 MyISAM 的区别是什么
- Innodb 支持事务。MyISAM 不支持
- Innodb 支持外键。MyISAM 不支持
- Innodb 主键索引的叶子节点是数据文件,辅助索引的叶子节点是主键的值 MyISAM 的主键索引和辅助索引,叶子节点都是数据文件的指针
- Innodb 不保存表的行数,执行 select count(*) from tb需要全表扫描。MyISAM 用一个变量保存了整个表的行数,执行上述语句只需要读取该变量,速度很快
- Innodb 所有的表在磁盘上保存在一个文件中。MyISAM 存储成三个文件。
- Innodb 需要更多的内存和存储。MyISAM 可被压缩,存储空间较小。
- Innodb 移植方案拷贝文件、备份 binlog,或者用 mysqldump,移植较困难。MyISAM 数据以文件形式存储,在备份和回复时可以单独针对表进行操作
- Innodb 支持行锁、表锁。MyISAM 支持表锁
- Innodb 在5.7版本之前不支持全文索引。MyISAM 支持全文索引
7.Mysql 什么情况会造成慢查,如何查看慢查询
- 没有设置索引,或查询没有用到索引
- I/O吞吐量过小
- 内存不足
- 网络速度慢
- 查询的数据量过大
- 锁或者死锁
- 返回了不必要的行或列
- 查询语句存在问题,需要优化
- 慢查询日志默认是关闭的,如果非必要,不要开启,会影响性能。
使用SHOW VARIABLES LIKE 'slow_query%';
slow_query_log,慢查询开启关闭状态
slow_query_log_file,慢查询日志存储位置,用文本编辑器打开存储位置的文件,查询慢查询
8.如何处理慢查询,你一般是怎么处理慢查询的
- 把数据、日志、索引放到不同的I/O设备上,增加读取速度
- 纵向、横向分割表,减少表的尺寸
- 升级硬件
- 根据查询条件,建立索引,索引优化
- 提高网速
- 扩大服务器内存
- 分库分表