加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

看这些MySQL的重要常识点,吃透它

发布时间:2019-10-24 14:26:31 所属栏目:编程 来源:芒果教你学编程
导读:序、什么是MySQL? MySQL 是一种相关型数据库,在Java企业级开拓中非经常用,由于 MySQL 是开源免费的,而且利便扩展。阿里巴巴数据库体系也大量用到了 MySQL,因此它的不变性是有保障的。MySQL是开放源代码的,因此任何人都可以在 GPL(General Public Lice

MyISAM是MySQL的默认数据库引擎(5.5版之前)。固然机能极佳,并且提供了大量的特征,包罗全文索引、压缩、空间函数等,但MyISAM不支持事宜和行级锁,并且最大的缺陷就是瓦解后无法安详规复。不外,5.5版本之后,MySQL引入了InnoDB(事宜性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。

大大都时辰我们行使的都是 InnoDB 存储引擎,可是在某些环境下行使 MyISAM 也是吻合的好比读麋集的环境下。(假如你不介怀 MyISAM 瓦解回覆题目的话)。

两者的比拟:

  1. 是否支持行级锁 : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默以为行级锁。
  2. 是否支持事宜和瓦解后的安详规复:MyISAM 夸大的是机能,每次查询具有原子性,其执行比InnoDB范例更快,可是不提供事宜支持。可是InnoDB提供事宜支持事宜,外部键等高级数据库成果。具有事宜(commit)、回滚(rollback)和瓦解修复手段(crash recovery capabilities)的事宜安详(transaction-safe (ACID compliant))型表。
  3. 是否支持外键: MyISAM不支持,而InnoDB支持。
  4. 是否支持MVCC :仅 InnoDB 支持。应对高并发事宜, MVCC比纯真的加锁更高效;MVCC只在 READ COMMITTED 和 REPEATABLE READ 两个断绝级别下事变;MVCC可以行使 乐观(optimistic)锁 和 气馁(pessimistic)锁来实现;各数据库中MVCC实现并不同一。
  5. ......

《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 。

  1. 操纵员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $50( $100-$50 )。
  2. 在操纵员 A 操纵的进程中,操纵员B 也读入此用户信息( version=1 ),并从其帐户余额中扣除 $20 ( $100-$20 )。
  3. 操纵员 A 完成了修改事变,将数据版本号加一( version=2 ),连同帐户扣除后余额( balance=$50 ),提交至数据库更新,此时因为提交数据版本大于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
  4. 操纵员 B 完成了操纵,也将版本号加一( version=2 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发明,操纵员 B 提交的数据版本号为 2 ,数据库记录当前版本也为 2 ,不满意 “ 提交版本必需大于记录当前版本才气执行更新 “ 的乐观锁计策,因此,操纵员 B 的提交被驳回。

这样,就停止了操纵员 B 用基于 version=1 的旧数据修改的功效包围操纵员A 的操纵功效的也许。

4.2. CAS算法

即compare and swap(较量与互换),是一种著名的无锁算法。无锁编程,即不行使锁的环境下实现多线程之间的变量同步,也就是在没有线程被阻塞的环境下实现变量的同步,以是也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操纵数

  • 必要读写的内存值 V
  • 举办较量的值 A
  • 拟写入的新值 B

当且仅当 V 的值便是 A时,CAS通过原子方法用新值B来更新V的值,不然不会执行任何操纵(较量和替代是一个原子操纵)。一样平常环境下是一个自旋操纵,即不绝的重试。

5、乐观锁的弱点

ABA 题目是乐观锁一个常见的题目

5.1 ABA 题目

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读