看这些MySQL的重要常识点,吃透它
MyISAM是MySQL的默认数据库引擎(5.5版之前)。固然机能极佳,并且提供了大量的特征,包罗全文索引、压缩、空间函数等,但MyISAM不支持事宜和行级锁,并且最大的缺陷就是瓦解后无法安详规复。不外,5.5版本之后,MySQL引入了InnoDB(事宜性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。 大大都时辰我们行使的都是 InnoDB 存储引擎,可是在某些环境下行使 MyISAM 也是吻合的好比读麋集的环境下。(假如你不介怀 MyISAM 瓦解回覆题目的话)。 两者的比拟:
《MySQL高机能》上面有一句话这样写到: 不要等闲信托“MyISAM比InnoDB快”之类的履历之谈,这个结论每每不是绝对的。在许多我们已知场景中,InnoDB的速率都可以让MyISAM瞠乎其后,尤其是用到了聚簇索引,可能必要会见的数据都可以放入内存的应用。 一样平常环境下我们选择 InnoDB 都是没有题目的,可是某工作况下你并不在乎可扩展手段和并发手段,也不必要事宜支持,也不在乎瓦解后的安详规复题目的话,选择MyISAM也是一个不错的选择。可是一样平常环境下,我们都是必要思量到这些题目的。 四、乐观锁与气馁锁的区别 1、气馁锁 老是假设最坏的环境,每次去拿数据的时辰都以为别人会修改,以是每次在拿数据的时辰城市上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程行使,其余线程阻塞,用完后再把资源转让给其余线程)。传统的相关型数据库里边就用到了许多这种锁机制,好比行锁,表锁等,读锁,写锁等,都是在做操纵之前先上锁。Java中synchronized和ReentrantLock等独有锁就是气馁锁头脑的实现。 2、乐观锁 老是假设最好的环境,每次去拿数据的时辰都以为别人不会修改,以是不会上锁,可是在更新的时辰会判定一下在此时代别人有没有去更新这个数据,可以行使版本号机制和CAS算法实现。乐观锁合用于多读的应用范例,这样可以进步吞吐量,像数据库提供的相同于write_condition机制,着实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是行使了乐观锁的一种实现方法CAS实现的。 3、两种锁的行使场景 从上面临两种锁的先容,我们知道两种锁各有优弱点,不行以为一种好于另一种,像乐观锁合用于写较量少的环境下(多读场景),即斗嘴真的很少产生的时辰,这样可以省去了锁的开销,加大了体系的整个吞吐量。但假如是多写的环境,一样平常会常常发生斗嘴,这就会导致上层应用会不绝的举办retry,这样反倒是低落了机能,以是一样平常多写的场景下用气馁锁就较量吻合。 4、乐观锁常见的两种实现方法 乐观锁一样平常会行使版本号机制或CAS算法实现。 4.1. 版本号机制 一样平常是在数据表中加上一个数据版本号version字段,暗示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若适才读取到的version值为当前数据库中的version值相称时才更新,不然重试更新操纵,直到更新乐成。 举一个简朴的例子: 假设数据库中帐户信息表中有一个 version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。
这样,就停止了操纵员 B 用基于 version=1 的旧数据修改的功效包围操纵员A 的操纵功效的也许。 4.2. CAS算法 即compare and swap(较量与互换),是一种著名的无锁算法。无锁编程,即不行使锁的环境下实现多线程之间的变量同步,也就是在没有线程被阻塞的环境下实现变量的同步,以是也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操纵数
当且仅当 V 的值便是 A时,CAS通过原子方法用新值B来更新V的值,不然不会执行任何操纵(较量和替代是一个原子操纵)。一样平常环境下是一个自旋操纵,即不绝的重试。 5、乐观锁的弱点 ABA 题目是乐观锁一个常见的题目 5.1 ABA 题目 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |