1、 **mysql 事物的特性:** 1 原子性:就是所有操作都完成,如果有中止,则操作回到之 前状态 2 一致性:确保数据库状态改变之后,成功提交事务 3 隔离性:事务之间彼此独立 透明 4 持久性:确保提交的事务结果在出现故障的情况下仍然存在 2、 **紧接着上面 面试官会问到你【事务的隔离级别】** 1 读未提交:客户端a 修改数据,未提交,客户端b就可以读到数据,一旦a因为某种原因回滚,那所有操作都会被撤销,客户端b读的数据就是脏数据,也就是脏读 2 读已提交:客户端a修改数据,未提交,客户端b是查询不到a更新的数据的,解决了脏读问题。但是 当客户端a 事务提交了,客户端b执行上一步相同的查询,结果是与上一步不一致 即产生了 不可重复读现象 3 可重复读: 客户端b事务提交之前 查询数据,同时客户端a修改数据并提交,客户端b查询到的数据和第一次查询数据是一致的,没有出现不可重复读的现象 4 串行化 Mysql默认事务的隔离级别:可重复读 。 这时候检索条件命中索引的时候会默认锁住next\_key ,如果检索没有索引,更新数据时会锁住整张表。一个事务被加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读 没有绝对的 根据需求来设置隔离级别 如果对数据的完整性和一致性要求越高 那就选择更高的隔离级别。但是会影响并发性能 3、 **不出意外面试官会问你【mysql索引都有哪些】** 1 普通索引 2 唯一索引:索引的列的值必须唯一。允许有空值 3 主键索引:只有一个主键并且不能为空 4 联合索引:多个字段组合创建索引,注意 组合索引遵循最左原则 5 全文索引:fulltext 虽然会大大提高查询速度但是会降低更新表的速度 联合索引例子:创建了(a,b,c)这样的索引 那么 可以支持 a | a,b | a.b.c 。 b,c 这样子是不支持的。这就是最左原则 什么情况下建索引: 1 表的字段唯一 这时候可以建唯一索引 2 直接条件查询的字段 where a = 3 字段作为了其他表的外键 4 查询中排序、统计、分组 的字段 索引字段要在where里,where条件中or索引不会起作用 什么时候不建议用索引: 1 表的数据太少 2 经常插入、修改、删除的表 3 数据重复项很多的字段 4 经常和主字段一起查询,但是主字段索引值比较多的字段 Like “%aaaa%”不会用到索引 ;not in 也不会用到索引 4、Mysql索引结构 常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树 ![](https://img.kancloud.cn/df/b0/dfb047d3bf0d14b834d91e043b486a01_618x270.jpeg) 叶子节点:B树层次为0的页面,存储记录的所有内容。 非叶子节点:B树层次大于0的页面,只存储索引键和页面指针。 相同层次的页面是用一个双向链表连接起来的。 一般情况下,从树的最左边叶子节点开始,一直向右扫描,就能得到树的从小到的的所有数据。所以 页内的数据都是按索引键排序的、后右面的索引值不会小于他左侧兄弟的任何节点的值 MYSQL MYSQL