一.有哪些存储引擎,有哪些区别
一般常用的存储引擎有InnoDB和MyISAM,区别如下:
1. InnoDB支持索引,MyISAM不支持。
2.InnoDB支持外键,MyISAM不支持,有外键的InnoDB转成MyISAM会报错。
3.InnoDB是聚集索引,采用B+Tree作为索引结构,数据文件是和索引绑定在一起的,必须要有主键,通过主键索引查询的效率会很高,但是辅助索引需要二次查询,先要查询到主键,然后在通过主键查询数据,因此主键不宜过大,因为主键过大,其他索引也会很大,MyISAM是非聚集索引,索引和数据文件是分离的,索引保存的是数据文件的指针,主键缩影和辅助索引是独立的,
4.InnoDB不保存表的具体函数,因此使用select count(*) from table 时会存在全表扫描,而MyISAM使用了一个变量保存全表的行数,读取全表行数的时候直接读取这个变量,因此速度很快(注意:不能加有任何where条件)
5.InnoDB支持行锁,表锁,MyISAM只支持表锁(InnoDB行锁是实现在索引上,而不是在物理行记录上,因此如果访问没有命中索引,则无法使用行锁,退化成表锁)
6.InnoDB一定要有主键,如果用户没有设置主键的话会自己找或者生产一个主键,MyISAM可以没有。
7.InnoDB存储文件有frm(表定义文件),ibd(数据文件) , MyISAM存储文件有frm(表定义文件),myd(数据文件),myi(索引文件)
二.事务
关系型数据库应该遵循ACID原则,具体如下:
1.原子性:事务是最小的执行单位,不允许分割,事物的原子性确保动作要么全部完成,要么完全不起作用
2.一致性: 事务执行前后,数据保持一致
3.隔离性: 并发访问数据库时,一个用户的事务不被其他事务干扰,各并发事务之间数据库是独立的
4.持久性: 一个事务提交后,他对数据库改变是持久的,即使数据库发生故障也不会有任何影响
为了达到以上事物特性,数据库定义了几种不同的隔离级别:
1.read_uncommited (未提交读) :允许读取未提交的数据变更(会导致脏读,幻读,不可重复读)
2.read_commited(提交读): 允许读取并发事务已经提交的数据(可以阻止脏读,但是幻读和不可重复读仍有可能发生)
3.repeatable_read(可重复度): 对同一字段的多次读取结果都是一致的,除非数据被本身事务所修改(可以阻止脏读,不可重复读,但幻读仍可能发生)
4.serializble(串行化):最高的隔离级别,完全遵从ACID原则。所有的事务依次逐个执行,这样事务完成不产生干扰 ,完成的解决了脏读,幻读,不可重复读,但是将严重影响系统性能,一般不会用到该级别
三.锁
行级锁和表级锁的区别:
表级锁:Mysql中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也少,加锁快,不会出现死锁,其锁定粒度最大,触发锁冲突的概率最大,并发率最低,MyISAM和InnoDB都支持表锁
行级锁:Mysql中锁定粒度最小的一种锁,只针对当前的操作行加锁,行级锁能大大减少数据库操作的冲突,锁粒度最小,并发率最大,但加锁的开销也最大,加锁慢,容易出现死锁
四.大表优化