数据库学习
一、MySQL索引
MyISAM索引:使用B+Tree,叶子结点保存数据记录的地址。MyISAM索引文件和数据文件分离,索引文件仅保存数据记录的地址。MyISAM的索引方式是“非聚集”的。
InnoDB索引:使用B+Tree,数据文件本身就是索引文件,索引的key是数据表的主键,表本身就是主索引,形成聚集索引。且,InnoDB必须要求有主键。InnoDB的非主键索引映射到相应记录的主键值,而不是数据地址。
聚集索引的方式使得按主键搜索十分高效,但是辅助索引搜索需要两遍索引。因此,不建议使用过长的字段作为主键,过长的主键索引会令辅助索引变得过大。建议使用单调的字段作为主键,避免非单调主键插入新数据时需要维持B+Tree的平衡而频繁地分裂调整,因此,对于InnoDB,一般推荐采用与业务无关的自增字段作为主键。
当使用组合索引时,遵循最左前缀匹配的原则,从组合组合索引的最左字段开始依次匹配,如果where子句不满足最左匹配原则,则该组合索引在此次查询中失效。
符合最左匹配原则的前提下,匹配某列的前缀字符串时(LIKE 'Senior%'),会使用到索引。
范围查询时(id<10010),使用到索引,但后续的where条件所涉及的列无法用到索引。
当查询条件中包含函数或者表达式时,不使用索引。
二、MySQL锁
二、MySQL事务
1. 隔离性
在数据库多事务并发处理情况下,数据库可能会存在脏读、不可重复读、幻读等问题。
脏读:读取了另一个事务未提交的数据
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。也就是说,这个事务在两次读取之间该数据被其它事务所修改。
幻读:一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。
数据库的四种隔离性:
Read Uncommitted(读未提交):进行读操作时不加行锁,写操作时加行级共享锁。可能出现脏读。
Read Committed(读提交):读操作时加行级共享锁,读完即释放,写操作时加行级排它锁。避免脏读,可能出现不可重复读,Oracle采用该默认隔离级别
Repeatable Read (可重复读):读操作时加行级共享锁,事务结束时释放,写操作加行级排它锁。避免不可重复读,可能出现幻读。MySQL采用该默认隔离级别
Serializable (序列化):读操作加表级共享锁,事务结束时释放,写操作加表级排它锁。
InnoDB采用MVCC的全称是“多版本并发控制”。这项技术使得InnoDB的事务隔离级别下执行一致性读操作有了保证,换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值。这是一个可以用来增强并发性的强大的技术,因为这样的一来的话查询就不用等待另一个事务释放锁。
在InnoDB中,为每行数据添加两个隐藏字段,一个用来记录数据行的创建时间,另一个用来记录行的过期时间(删除时间)。在实际操作中,存储的并不是时间,而是事务的版本号,每开启一个新事务,事务的版本号就会递增。
在相应的隔离级别下,进行增删改查操作时,会对这两个字段对应的版本号同当前事务的版本号进行对比,从而进行具体操作。