隔离级别
脏读:一个事务能够读取到另一个事务未提交的数据。如果这个未提交的事务最后回滚了,那么之前读取到的数据就是无效的
不可重复读:指在一个事务执行内多次读同一数据时,中间其他事务修改数据导致读取不一致情况。
幻读:事务在读取中发现数据多了一些不存在的数据,即别的事务进行插入。
常见的隔离级别
读未提交:读取另一个事务未提交的数据,会产生脏读等。
读已提交:只能读已提交的事务,禁止了脏读,会产生不可重复读、幻读等。
可重复读:一个事务在执行过程中可以多次读取同一数据,即使其他事务修改了。
串行化:给整个表加锁,完全避免了脏读、不可重复读和幻读,但是性能代价较高
char和varchar的区别?
char是定长字符串,即会将字符串右边填满空格以达到指定长度,在检索时会去掉空格,而varchar是长度可变字符串。
Decimal和float/Double的区别?
decimal是定点数,可以存储精确的小数值,而float和double是浮点数,只能存储近似的小数值。
NULL和"(空字符串)的区别?
- 占用空间:空字符串长度为0,不占用空间,而null会占用空间。
- null不同场景值不同:例如使用查询null=null返回为false,而在一些语句中如distinct的值是相同的,而空字符串之间肯定是相等的。
- 判断语句不同:null只能使用is null或者is not null来进行判断,不能使用=、!=、 <、> 等运算符,而空字符串可以。
一条 SQL 语句在 MySQL 内部是如何执行的?
- 首先是进入连接器,主要做身份验证和权限相关。
- 其次查询缓存,如果命中则直接返回。
- 若未命命中,则讲语句传入分析器:分析语句目的、语法是否错误等。
- 接着传入优化器:按Mysql最优方案执行语句。
- 最后由执行器执行:执行sql语句,从存储引擎中返回数据。
- 存储引擎:负责数据的存储和读取。
B树和B+树的区别?
- 存储方式不同:B树所有节点既存放key,又存放数据data,而B+树只有叶节点存放key和value,而内部节点只存放key;
- 叶子节点结构不同:B+树叶子节点间还存在一个链表,方便遍历;
- 稳定性:因为B+树所有数据都存放在叶子节点,故访问时间稳定,而B树访问过程中可能未到叶子节点就查找到了;
- 范围查找速率不同:B+树首先遍历树找到下限,再遍历链表找到上限,而B树还需要二分查找。
Mysql事务
一组命令操作,要么同时成功,要么同时失败!
命令
start transaction;
语句1;
语句2...
commit;
乐观锁和悲观锁
悲观锁:非常悲观,害怕别人修改数据,故访问数据会加上锁。
加上锁后其他线程不能访问。
表锁、行锁、读锁、写锁都是悲观锁。
场景:高并发的读写场景,关键的业务流程。
乐观锁:非常乐观,每次拿数据时认为别人不会修改数据,故不加锁。
如果更新数据就会查看当前线程从最后一次读取到到现在是否有别的线程修改,若有修改则先读取新数据,再尝试更新。
场景:乐观锁适用于多读的应用类型,这样可以提高吞吐量。
聚簇索引和非聚簇索引的区别?
- 叶节点存储的数据不同:聚簇索引叶节点存放行数据,而非聚簇索引叶节点存放主键;
- 查询效率不同:因为非聚簇索引还需要返回原表进行二次查询,故查询数据慢;
- 个数限制:聚簇索引一般为主键索引,故一个表只能有一个,而非聚簇索引可以有多个。
如何对sql查询优化?
- 应用缓存策略:将经常访问的查询语句放在缓存中;
- 创建索引:对于数据量大的表可以通过建立聚簇索引来提高查询效率;
- 模糊查询用_代替%:%是任意字符,很容易触发全表扫描;
- 禁止使用select * 来查询,防止索引失效。
数据库3范式
- 1NF:属性不可再分;
- 2NF:不存在非主属性对主键的部分函数依赖;
- 3NF:不存在传递函数依赖,即非主属性之间是独立的,不存在依赖关系。
MVCC是什么?
mvcc是处理mysql并发事务的一种控制方式,即对一份数据做多份备份,让事务能访问到相应的版本。
Mysql三大日志
归档日志(binlog)和重做日志(redolog)和回滚日志(undolog)
binlog:记录数据库表结构更改和数据更改的二进制文件,主要是用于数据的恢复和同步。
redolog:记录数据执行的变动情况,是存储引擎级别的,记录脏页(即数据在内存未同步至rdb文件。使用一个循环队列来写,会产生一个数据覆盖)。
undolog:用来记录数据的历史版本,方便数据的回滚操作。
对于不同操作生成结构不同:
新增操作:记录新增的id。
修改操作:记录修改前的值。
删除操作:在记录上打上一个delete标志,方便回滚。