1、MyISAM和INNODB
1.1、MYISAM:是非聚集索引
叶节点的data域存放的是数据记录的地址,MYISAM索引文件和数据文件是分离的,索引文件仅仅保存数据记录的地址。索引检索的算法为首先是按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出data域的值,然后以data域的值为地址,读取相应的数据记录
1.2、INNODB:聚集索引
第一个重大区别INNODB的数据文件本身就是索引文件,这棵树的叶节点data域保存了完整的数据记录。但是辅助索引搜索需要检索两遍索引:首先是检索辅助索引获得主键,然后用主键到主索引中检索获得记录。因此要求表必须有主键(MYISAM可以没有)
如果我们定义了主键,那么INNODB就会选择其作为聚集索引;如果没有定义主键,则INNODB会选择第一个不包含有null值的唯一索引作为主键索引
1.3、四类索引
index:普通索引,数据可以重复,没有任何限制
unique:唯一索引,要求索引列的值必须唯一,但是允许有空值
primary key:主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的时候创建主键索引
fulltext:全文索引,是对于大表的文本域:char、varchar、text才能创建全文索引,主要用于查询文本中的关键字,并不是直接进行值比较。目前只有MYISAM支持。INNODB5.6以下还不支持
1.4:MYISAM和INNODB的区别
MYISAM:不支持事务,不支持外键,适合查询和插入为主的应用,支持全文索引,可以和其他字段一起建立联合索引
INNODB:支持事务,支持外键,适合频繁修改以及涉及到安全性较高的应用,不支持全文索引,是默认引擎

2、数据库的三范式
第一范式:对属性的原子性约束,要求字段具有原子性,不可在分解。(只要是关系型数据库都满足)
第二范式:在满足第一范式下,非主键字段不能出现部分依赖主键;
第三范式:在满足第二范式下,非主键字段不能出现传递依赖

3、delete、drop、truncate
truncate和delete只删除数据,不删除表结构,drop删除表结构,并且释放所占的空间
速度:drop > truncate > delete
使用场合:不在需要表的时候:drop
保留表,删除所有数据:truncate
删除部分记录:delete

4、innodb为什么要用自增id作为主键
使用自增主键,每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满就会自动开辟一个新的页

5、分库与分表设计
目的:减少数据库的单库单表的负担,缩短查询时间
1、通过分表:可以减少数据库的单表负担,将压力分散到不同的表上,同时因为不同的表上的数据量少,所以提高了查询的性能,缩短查询时间,还可以很大的缓解表锁问题
2、水平分表:取模分表就属于随机分表,时间维度分表则属于连续分表
如何设计好垂直拆分:先将不常用的字段拆分到另外一张扩展表,将大文本的字段单独拆分到另外一张扩展表,将不经常修改的子端和常改变的子端分开放。对于海量用户场景,可以考虑取模分表,数据相对比较均匀,不容易出现热点和并发访问的瓶颈
3、库内分表:仅仅是解决了表单数据过大的问题,但是并没有把表单的数据分散到不同物理机上,因此不能减轻mysql服务器的压力,任然存在在同一个物理机上的资源竞争,包括cpu,内存,等

6、分库分表带来的分布式困境的应对之策
1、数据迁移和扩容问题:一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中
2、分页与排序问题:需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后在返回给用户
3、分布式全局唯一ID-UUID、GUID等

7、聚集索引与非聚集索引的区别:
通过聚集索引可以查到需要查找的数据,而通过非聚集索引可以查到记录对应的主键值,在使用主键值通过聚集索引查找所需要的数据
根本区别是表记录的排序和与索引的排序是否一致。聚集索引的叶节点就是数据节点,而非聚集索引是叶节点任然是索引节点,只不过是保存了数据的地址

8、事务四大特性ACID
A:原子性:一个事物中的所有操作,要么全部完成,要么全部不完成,不会结束在中间环节
C:一致性:在事务开始之前和结束之后,数据库的完整性没有被破坏
I:隔离性:数据库允许多个并发事务同时对其数据进行读写和修改能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
D:持久性:事务处理结束后,对数据的修改是永久的,即使系统故障也不会丢失

9、事务并发,隔离级别
1、脏读:指在一个事务处理过程中读取了另一个事务未提交的数据(事务A读取了事务B更新的数据,然后B回滚,那么A读取的就是脏数据)
2、不可重复读:对于数据库的某个数据,一个事物范围内先后两次读取的结果不一样(事务A多次读取同一数据,事务B在事务A读取过程中,对数据更新并提交,就会导致事务A再次读取同一数据时,会导致本事务先后两次读到的数据结果会不一致)
3、幻读:幻读解决了不重复读,保证了同一个事务里,查询的结果都是事务开始时的状态(一致性)。
隔离级别
1、读未提交:就是一个事务能看到其他事务尚未提交的修改,,脏读出现
2、读已提交:事务能看到的数据是其他事务已经提交的事务,会出现不可重复读,脏读不会出现
3、可重复读:保证事务多次读取的结果是一致的,是mysql INNODB引擎默认隔离级别
4、串行读:并发事务是串行化的,通常意味着读取需要获取共享读锁,更新需要获得排他写锁,如果sql使用where语句,还会获取区间锁,最高隔离级别
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能影响也越大。出现问题可以用悲观锁和乐观锁来控制

10、简单说一下SQL怎么优化
1、建索引(聚集索引(主键索引),非聚集索引,组合索引),数据库索引是对数据库表中一列或多列的值进行排序的一种结构
2、减少表之间的关联
3、优化sql,尽量让sql很快定位数据,不做全表查询
4、简化查询字段,没用的字段不要,已经对返回的结果的控制,尽量返回少量数据
5、尽量使用preparedStatement来查询,不要用statement
6、尽量避免使用or来连接条件

11、如何做mysql的性能优化
1、为搜索字段创建索引
2、避免使用select *,列出需要查询是字段
3、垂直分割分表
4、选择正确的存储引擎

12、实践中如何优化mysql
1、sql语句及索引优化
2、数据库表结构优化
3、系统配置优化
4、硬件优化

13、数据库悲观锁和乐观锁的原理和应用场景?
悲观锁:先获取锁,在进行业务操作,一般是利用select / for update这样的语句,对数据加锁,避免其他事务意外修改数据,锁定查询的行
乐观锁:1、是在不锁定表的情况下,利用业务的控制来解决并发问题,这样既保证数据的并发可读性,又保证保存数据的排他性,保证性能的同时解决了并发带来的脏数据问题
2、大多是基于数据版本version记录机制实现的。具体是现实是给数据库表加一个version字段,用来记录数据库表被更新的次数,表被修改时version加一。线程更新数据库时读到version的值,在提交更新时,当前的version>=数据库中version值才更新

14、索引是什么?mysql为什么使用B+树,不用其他?有什么特点
1、索引:是帮助mysql高效获取数据的数据结构
2、B+树索引:是数据库索引索引所采用的存储结构,数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。B+树索引需要从根节点到枝节点,最后才能访问到页节点这样多次IO访问;
3、hash:虽然可以快速定位,但是没有顺序,IO复杂度高
二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高
红黑树:树的高度随着数据量增加而增加,IO代价高
4、为什么说B±tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
B+树的磁盘读写代价更低,B+树查询效率更加稳定
索引使用B+树原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围查询是非常频繁的,而B树只能中序遍历所有节点,效率太低
5、B+树特点
1、所有关键字都出现在叶子节点的链表中,且链表中的关键字恰好是有序的
2、不可能在非叶子节点命中
3、非叶子节点相当于是叶子节点的索引,叶子节点相当于是存储数据的数据层;

15、游标
游标:一条SQL语句,对应N条资源,取出资源口,就是游标
步骤:1、声明declare,2打开游标open,3、从游标中取值fetch,4、关闭游标close

16、存储过程:是一个预编译的sql语句,使用存储过程比单纯sql语句执行要快
1、 delimiter //
create procedure 存储过程名(参数名1 参数类型1......)
begin
代码块
end //
delimiter;
2、 调用:call 存储过程名
3、 删除:drop 存储过程名
4、支持if、if..else、case、while语句

17、各种索引的概念
分类:主键索引、唯一索引、普通索引、全文索引、组合索引
按聚集分类:聚集索引、非聚集索引
1、普通/索引:不允许有空值、指字段唯一、不为空的列
2、唯一索引:保证数据记录的唯一性,允许空值,unique
3、主键:是一种特殊的唯一索引,一张表只能定义一个主键索引,primary key
4、外键:表的外键是另一张表的主键

18、什么是视图,游标
1、视图:是一张虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能
2、游标:是对查询出来的结果集作为一个单元来有效的处理。一般不使用游标,但是需要逐条处理数据的时候,游标就十分重要

19、连接
1、内连接:只有两个元素表相匹配的才能在结果集中显示
2、外连接:左外连接:左表为驱动表,数据全部显示,匹配表只有匹配的才会显示,不匹配的不显示
右外连接:右表为驱动表,数据全部显示,匹配表不匹配的不显示
3、全外连接:连接的表中不匹配的数据全部会显示出来
4、交叉连接:笛卡尔效应,显示的结果是链表数的乘积