1、数据库三大范式
第一范式:列不可分割
第二范式:数据最好使用主键索引来保证唯一性
第三范式:如果可以通过其他表推导出来的数据,那么表中不要创建冗余列。
2、Binlog的记录方式
使用statement进行记录,记录每次修改操作语句
使用row记录,更加详细,记录操作的哪行数据,还有修改的值,日志量记录很大
两种折中,先使用statement,保存不了在使用row
3、MyISAM和Innodb的区别
MyIsam不支持事务,还有行级锁和外键
Innodb支持事务,行级锁,外键
4、MyISAM和Innodb的索引区别
1、Innodb是聚簇索引,叶子节点存储的是行数据。所以查询很高效
2、MyISAM是非聚簇索引,叶子节点存储的是行数据地址,需要在查询一次。
5、索引的优缺点
优点:提高查询速度
缺点:占用空间,并且进行了增删之后需要对索引进行维护
6、索引使用场景
where 之后字段。更加快速的判断
orderBy之后字段。索引自带排序,更加快速
join on 之后等值条件判断
7、索引的类型
主键索引:唯一不重复,不为null
唯一索引:唯一不重复
普通索引:
全文索引:
8、索引实现
B+树实现。基于自平衡二叉树,叶子节点存储行数据,二分快速查询数据
哈希索引。基于哈希表存储,hashcode,找单行数据更快
9、索引基本原理
就是把无序的数据变成有序的查询
建立了索引的列进行排序,之后生成倒排表,在拼上数据链接地址。
10、索引设计原则
设计到where或者on后面的字段,常用来做查询条件的字段
使用短索引,长字符串可以规定前几位。节省空间。不要过度创建。
11、创建索引的原则(非常重要)
1、查询频繁的字段
2、更新频繁的不要新建
3、数据区分度不高的不要建
4、查询少,重复值很高的字段不要建
5、长字符串字段不要建
6、尽量扩展索引而不是新建
7、最左前缀匹配原则,判断从左到右依次到匹配有范围查询的判断条件。所以建立组合索引,应该把等值判断的条件放在前面。在使用时,将第一个索引放在判断条件最前面。
12、前缀索引如何建立
使用count()/count(distinct left(password,prefixLen)),接近1时就可以
13、删除大量数据时,怎么删除
先删除索引,再删除数据。会快速很多,之后在重新建立索引。
14、什么是聚簇索引,什么是非聚簇索引
聚簇索引就是数据存储和索引存放在一起的
非聚簇就是没有存放在一起,只是存放了数据存储地址,还要回表查询。
15、慢查询
慢查询是用于发现SQL查询问题的,可以手动更改设慢查询时间,后通过设置到表,进行查询发现
16、SQL分析EXplain注意的列
type—-看什么级别,all全表扫描就不可取
possiblekeys—-可能命中的索引
key—实际命中的索引
rows—实际扫描了多少行数据
17、profile是分析SQL执行过程
18、联合索引查询时的覆盖索引和回表指的是什么
回表指的是命中辅助索引,辅助索引中存放的是主键索引的key值,需要在通过主键索引去查找值
覆盖索引指的是查询的字段和命中的索引字段是一个字段,就直接返回。
19、分页查询偏移量大的时候,怎么进行优化
可以先通过索引列去查询到偏移量的位置,在进行查询,分页数据。
20、主从同步的原理
主从同步是主机记录binlog操作日志,然后从机通过一个线程监听主机binlog,然后使用主机提供的账号去回去binlog更新内容,之后生成中继日志readylog,再讲readylog转换成SQL语句,进行数据库操作
21、联合索引的最左匹配原则
联合索引在使用时,如果没有使用到最左边的主要索引,那么即时是使用了联合索引的辅助索引也是没有用的。
22、反三范式如何保证数据统一
可以使用触发器,当主表数据更新,触发更新,额外发送一条SQL同步。
23、索引失效的场景
1、使用了or
2、like前置匹配
3、查询条件字段使用了函数运算
4、in 子查询语句
5、is null 可以通过设置null为0 来解决
24、count()如何优化
数据量过于大,可以使用单独建立一张表记录数据。其他还是推荐count(*)
25、SQL死锁问题怎么解决
26、DQL怎么优化
小标驱动大表
在查询条件中使用索引
避免使用范围判断条件,!=等等
27、为什么使用B+树作为存储引擎的数据结构存储方式
1、B+树分为内部节点和叶子节点,内部节点默认大小为16KB,并且只用于存储key和地址值,能够使树的高度更矮,减少IO
2、叶子节点存储数据是通过链表方式,支持范围和有序
3、每次IO时间稳定。