1 什么是反范式
数据库设计的三大范式指的是:
- 1NF:字段不可再分
- 2NF:所有的非主属性完全依赖主键
- 3NF:所有非主属性不存在传递依赖主键的情况
硬编码
2 如何避免Mysql死锁
- 尽量使用主键更新数据,防止使用非聚簇索引回表时和使用聚簇索引冲突造成死锁。
- 在允许幻读和不可重复度的情况下,尽量使用RC的隔离级别,避免gap lock造成的死锁。
- 避免长事务,将事务拆解
- 设置锁超时等待innodb_lock_wait_timeout
3 执行一条Sql的过程
对于一条sql的执行主要分为以下几个步骤:
-
连接器(建立客户端和服务端的连接)
-
查询缓存(是k-v结构的缓存,k的话就是sql语句,如果出现ddl则会删除缓存,所以这个缓存是很鸡肋的,在mysq后面的版本中也随之删除了)
-
Sql解析(sql解析主要分为俩个过程,分别是词法分析和语法分析,词法分析是将关键词提取出来,语法分析是构建一棵语法树)
-
执行SQL(分为三个阶段:)
-
预处理(会将*解析成列名,判断所查的表或者列是否存在,不存在的话在这一步就会直接报错)
-
优化器(这一步其实和我们平时用explain所看到的很一致的,所要决定的就是要不要走索引,走哪个索引,去做出一个判断)
-
执行器
4 那你了解explain的结果都有什么含义吗?
一定要看
5 有哪些优化索引的方法?
-
前缀索引优化
-
覆盖索引
-
主键自增(B+树的节点是按照主键排序的,如果自增的话新增不需要挪动节点)
-
索引列设置为NOT NULL
-
索引列存在NULL,会使优化器的操作变得更复杂
-
对索引进行统计时,NULL会被忽略
-
NULL虽然没意义,但是会占用空间,
**⚠️****注意:**Mysql的列存储分为俩部分,一部分是额外信息,一部分是真实数据。额外信息包含:变长字段、NULL值列表、头信息。
变长字段:按照列的逆序存放变长字段的字节值
NULL值列表:逆序每一个为1的位代表对应位置为NULL
头信息:delete_mask、next_record、record_type
delete_mask标记为1则代表删除,后面又符合条件的数据可以覆盖,也可以通过optimise table进行数据表重建,实现真实清空。
- 防止索引失效
6 表空间文件的结构是怎么样的?
表空间由段(segment)、区(extent)、页(page)、行(row)组成
7 Innodb和myisam的区别
MysQL5.5之前的默认存储引擎是MylSAM,5.5之后改为了InnoDB。首先对于InnoDB存储引擎,提供了良好的事务管理、崩溃修复能力和并发控制。因为InnoDB存储引擎支持事务,所以对于要求事务完整性的场合需要选择InnoDB,比如数据操作除了插入和查询以外还包含有很多更新、删除操作,像财务系统等对数据准确性要求较高的系统.缺点是其读写效率稍差,占用的数据空间相对比较大.其次对于MylSAM存储引擎,如果是小型应用,系统以读操作和插入操作为主,只有很少的更新、删除操作,并且对事务的要求没有那么高,则可以选择这个存储引擎.Mylsam存储引擎的优势在于占用空间小,处理速度快;缺点是不支持事务的完整性和并发性.这两种引擎各有特点,当然你也可以在mysql中,针对不同的数据表,可以选择不同的存储引擎.
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM 不支持事务、行级锁、外键 ,有一个毫无疑问的缺陷就是崩溃后无法安全恢复。