事务是什么?
一系列操作,要么全部完成,要么一个都不做
事务的ACID特性
原子性:一系列操作要么都执行,要么都不执行
一致性:事务执行前后数据完整性不变,如转账前后总金额不变
隔离性:多个事务并发访问数据库,事务之间互相隔离
持久性:事务提交后,在数据库中的改变是持久的,即使发生故障也一样
事务的隔离级别
未提交读:可出现脏读、不可重复读、幻读
不可重复读:不会出现脏读,可能出现不可重复读、幻读
可重复读:不会出现脏读、不可重复读,可能出现幻读
串行化:不会出现脏读、不可重复读、幻读
事务并发问题(脏读、不可重复读、幻读)
脏读:A读到了B未提交的数据
不可重复读:A重复读某一数据,B修改提交该数据,A读到了和之前不一样的数据
幻读:A修改了所有数据,B插入(修改)一条未修改的数据,A发现有一条数据未修改
MyISAM与InnoDB 的区别
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,(所以最好把多条SQL语言放在begin和commit之间,组成一个事务);
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败
InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构)。 MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的。
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
那么为什么InnoDB没有了这个变量呢?
因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。
InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁
InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。如果访问没有命中索引,也无法使用行锁,将要退化为表锁。
InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
Innodb:frm是表定义文件,ibd是数据文件
Myisam:frm是表定义文件,myd是数据文件,myi是索引文件
那么如何选择mysql引擎呢?
Innodb已经成为Mysql的默认引擎,它的优势是显而易见的。
1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;
2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。
3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;
left join,right join,inner join,full join之间的区别
left join会返回左表的所有行,即使在右表中没有匹配的数据
right join会返回右表所有行,即使在左表中没有匹配的数据
inner join会返回两个表共有的数据
full join会返回两个表所有行,即使没有匹配
三大范式
第一范式(1NF): 列不可再分(原子性)
例:年级学校 -> 年级学校
第二范式(2NF): 首先满足第一范式,然后必须有主键,非主键必须完全依赖主键,即非主键既不能不依赖主键,也不能只依赖主键的一部分。
例:学号 姓名 课程号 课程名
首先满足第二范式,同时其他非主键必须直接依赖主键,不能间接依赖
间接依赖:学院依赖学号,学院地址依赖学院,间接依赖学号
切分数据库(水平切分、垂直切分)
为什么要切分数据库
当单表记录数过大,CRUD性能会明显下降
水平切分:将一张表切分为多张表
例:商品表 -> 商品表1 + 商品表2
垂直切分:按业务切分,同一类业务的表放到同一个库里
例:网站系统(商品表、订单表、用户表)仓库系统(进货表、出货表)
水平切分和垂直切分的顺序:应先做水平切分,数据量再增大,考虑垂直切分
什么是池化思想?为什么要用数据库连接池?
池化思想:
生活中的例子:每次都打好了几盒饭在那里放着,你可以直接取。和你要打饭才开始打。
初始预设资源,抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等
数据库连接池:
连接池中先创建一定数量的连接,程序要获取连接直接从池中取,不必创建新的连接。如果池中的连接被用完了,新建一个放入池中。
什么是索引?优缺点是什么?
索引是用于快速查询和检索数据的数据结构,索引的常用数据结构有hash和B+树;
优点:可以提高检索速度,如果是唯一索引还能保证数据每一行的唯一性
缺点: 创建和维护索引的耗时,索引还占用存储空间
索引主要使用的数据结构?
hash:hash索引底层是hash表,查询单条记录时hash索引更快,其余大部分场景更适合使用B+树索引
B+树:索引底层使用B+树, B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。 B+ 树元素自底向上插入。
B树和B+树区别?
B树所有节点既存放key,也存放data。B+树只有叶子节点存放key和data,其余节点只存放key
B树的叶子节点独立的,B+树的叶子节点组成一条链表,可以通过它找到相邻的叶子节点。
B树检索时不一定会检索到叶子节点,B+树检索时一定会检索到叶子节点。
Hash索引和B+树索引优劣分析?
hash索引优点定位快,但不支持顺序查询和范围查询,而且极端情况下发生大量Hash冲突(多个key的hash值相同)的话,查询也会变慢。</