mysql事务能够理解为一系列操做,要么成功执行,要么失败。html
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住知足条件的行,解决幻读须要锁表mysql
MyISAM: 节约空间,读取响应速度快,表应用于读的场景比较多,支持FULLTEXT类型的索引数据库
InnoDB: 若是应用程序须要用到事务,使用外键或须要更高的安全性,以及须要容许不少用户同时 修改某个数据表里的数据,则InnoDB数据表更值得考虑。支持行锁(某些状况下仍是锁整表,如 update table set a=1 where user like '%lee%'安全
Memory: 存储在内存中,因此没有持久化。能够用于test中假数据的读写数据结构
实例:公司之前的一张表用的是MyISAM,忽然有一天这张表不能读写几个小时。公司上下折腾了很久。最后缘由是这张表用的是MyISAM,同时正好有人向表中新加入一列,同时进行索引,因为表很大,因此一直在作索引。所以整张表一直处于锁的状态。并发
在MySQL执行语句中,插入或者更新操做不多有性能问题
大部分性能问题都是复杂的查询操做致使的。缘由的话要从sql读取数听说起:性能
数据库数据保存在磁盘上,每次读取数据,为了提升性能,须要把部分数据读取到内存来计算。
然而磁盘读取很是慢,因此每次读取IO都会读取相邻的数据,称之为每次读取一页数据(page, 4k/8k)
基于以上原理,咱们要设计得是每次查询都能使磁盘IO最小,所以b+树知足条件:spa
图中比较重要的几点:设计
如图所示,若是要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找肯定29在17和35之间,锁定磁盘块1的P2指针,内存时间由于很是短(相比磁盘的IO)能够忽略不计,经过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,经过指针加载磁盘块8到内存,发生第三次IO,同时内存中作二分查找找到29,结束查询,总计三次IO。真实的状况是,3层的b+树能够表示上百万的数据,若是上百万的数据查找只须要三次IO,性能提升将是巨大的,若是没有索引,每一个数据项都要发生一次IO,那么总共须要百万次的IO,显然成本很是很是高。
当b+树的数据项是复合的数据结构,好比(name,age,sex)的时候,b+数是按照从左到右的顺序来创建搜索树的,好比当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来肯定下一步的所搜方向,若是name相同再依次比较age和sex,最后获得检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪一个节点,由于创建搜索树的时候name就是第一个比较因子,必需要先根据name来搜索才能知道下一步去哪里查询。好比当(张三,F)这样的数据来检索时,b+树能够用name来指定搜索方向,但下一个字段age的缺失,因此只能把名字等于张三的数据都找到,而后再匹配性别是F的数据了, 这个是很是重要的性质,即索引的最左匹配特性。
索引及explain详解
好的话点个赞吧!!!