1.MySQL数据库都是支持事务的吗?
在缺省模式下,MYSQL是autocommit模式的,所有数据库更新操作都会及时提交,所以在缺省模式下,mysql是不支持事务的。如果你的表类型是InnoDB Tables或者BDB tables,mysql可以使用事务处理,使用set autocommit = 0就可以使mysql允许在非autocommit模式,必须使用COMMIT提交或者ROLLBACK更改。
2.介绍一下replace into?
replace into和insert功能相似,不同点在于:
- 如果发现表中已经存在此行数据,则先删除再插入新数据
- 若不存在则直接插入
- 注意:除非表中有primary key和unique索引,否则使用一个replace语句没有意义,该语句会和insert相同,因为没有索引被用于确定是否新行复制了其他的行。
3.索引的优化?
- like语句的前导模糊查询不能使用索引
- union、in、or都能够命中,建议用in
- 负向条件查询不能使用索引:!=、<>、not in、not exists、not like
- 遵循联合索引的最左前缀原则
- 不能使用索引中范围条件右边的列,范围列之后列的索引全失效
- 不要在索引列上做任何操作,否则会导致索引失效而转向全表扫描
- 强制类型转换会全表扫描
- 更新十分频繁、数据区分度不高的列不宜建立索引
- 利用覆盖索引来进行查询操作,避免回表,减少select使用
- 索引不会包含NULL值的列,IS NULL,IS NOT NULL无法使用索引
- 如果有order by、group by,利用索引有序性
- 使用段索引
- 利用延迟关联或子查询优化超多分页场景
- 如果明知道只有一条结果返回,limit 1提高效率
- 超过三个表不要使用join
- 单表索引控制在5个以内
- 业务上有唯一特性的字段、即使是多个字段的组合,也必须建成唯一索引
4.使用索引有哪些缺陷?
4.1降低了表的更新速度
更新表时,MYSQL不仅要保存数据,还要保存一下索引文件每次更新的索引列的字段
4.2占用空间
索引实际上也是一张表,保存了主键与索引字段,并指向实体表的记录
5.可重复读是怎么实现的?
MVCC(多版本并发控制)(实现原理在第一天)
undolog+版本链+比较规则