《Mysql技术内幕》读书笔记

第一章 MySql存储引擎

1.Innodb存储引擎java

支持事务,其特色是行锁设计、支持外键。mysql

Innodb是Mysql默认的存储引擎。算法

2.MyISAM存储引擎sql

MyIsam存储引擎不支持事务和表锁设计,可是支持全文索引。数据库

第五章 索引与算法

1.常见的索引:B+树索引、全文索引、哈希索引。数组

2.B+树,是经过二叉查找树,再由平衡二叉树,B树演化而来。数据结构

二叉查找树

二叉查找树:左子树的值老是小于根的值,右子树的值老是大于根的值。能够经过中序遍历获得值的排序输出。架构

平均查找速度比顺序查找来得快。函数

平衡二叉树(AVL树)

平衡二叉树:首先符合二叉查找树的定义,其次必须知足任何节点的两个子树的高度的最大差为1。优化

B+树

B+树:是为磁盘或其余直接存取辅助设备设计的一种平衡树。

在B+树中,全部记录节点都是按键值对的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行链接。

优势:B+树的高度通常都在2--4层。也就是查找某一键值的行记录时最多只须要2--4次IO就能够了。

B+树索引

B+树索引,分为汇集索引和辅助索引。

汇集索引和辅助索引的区别:叶子节点存放的是不是一整行的信息。

汇集索引

汇集索引:就是按照每张表的主键构造一颗B+树,同时叶子节点存放的即为整张表的行记录数据,也将汇集索引的叶子节点称为数据页。

辅助索引

辅助索引:叶子节点并不包含行记录的所有数据。叶子节点除了包含键值之外,每一个叶子节点中的索引行中还包含了一个书签(bookmark)。该书签用来告诉Innodb存储引擎哪里能够找到与索引相对应的行数据。辅助索引的书签就是相应行数据的汇集索引键。

Cardinality值

1.SHOW INDEX FROM 表名

:该语句能够查看表的索引信息。

2.Cardinality值很是关键,优化器会根据这个值来判断是否使用这个索引。

对于性别,地区类型的字段,可取值的范围小,称为“低选择性”,没有必要使用B+树索引。

Cardinality值,表示索引中不重复记录数量的预估值。在实际运用中,Cardinality尽量地接近1。若是很是小,用户须要考虑是否还有必要建立这个索引。

EXPLAIN

能够查看查询类型,以及索引。

PROSSIBLE_KEY:可能的索引。

KEY:实际的索引。

联合索引

1.联合索引是指对表上的多个列进行索引。

2.联合索引也是一颗B+树,不一样的是联合索引的键值的数量不是1,而是大于等于2。

联合索引的键值都是排序的。经过叶子节点能够逻辑上顺序地读出全部数据。

数据按(a,b)进行存放,排序方式相似于(1,1)、(1,2)、(2,1)、(2,4)、(3,1)、(3,2)、(4,1)。

对于单个的a列查询来讲,可使用(a,b)这个联合索引。

但对于单个的b列查询来讲,则不可使用(a,b)这个联合索引,由于叶子节点上的b值为1,2,1,4,1,2,显然不是排序的。

3.索引的第二个好处是已经对第二个键值进行了排序。

4.对于联合索引(a,b,c)来讲,如下语句能够直接经过联合索引获得结果。

SELECT * FROM TABLE WHERE a=XXX ORDER BY b
SELECT * FROM TABLE WHERE a=XXX AND b=XXX ORDER BY c

可是如下的则不行:

SELECT * FROM TABLE WHERE a=XXX ORDER BY c

覆盖索引

1.InnoDBd存储引擎支持覆盖索引,即从辅助索引中就能够获得查询的记录,而不须要查询汇集索引中的记录。

使用覆盖索引的一个好处是,辅助索引不包含整行记录的全部信息,故其大小要远小于汇集索引,所以能够减小大量的IO操做。

其余

1.FIC : Fast Index Creation。

2.Online DDL

哈希算法

1.哈希表也成为散列表。由直接寻址表改进而来。

哈希表,利用哈希函数h,根据关键字k计算出槽的位置。

2.哈希碰撞:两个不一样的关键字,可能映射到同一槽中。成为“碰撞”。

解决碰撞的方法:链表法。把同一哈希槽中的全部元素放在一个链表中,
在槽中有一个指针j,指向链表头。

3.哈希函数,最重要是散列,减小碰撞。

4.散列算法:除法散列。

全文检索

0.全文检索:是将存储于数据库中的整本书或整篇文章的任意内容信息查找出来的技术。能够根据须要得到全文中有关章、节、段、句、词的信息。也能够进行统计和分析。

1.左模糊不走B+树索引。

2.倒排索引:在辅助表中存储了单词和单词自身在一个或多个文档中所在位置的映射。经过关联数组实现。

3.全文检索的SQL语句:
SELECT * FROM 表名 WHERE MATCH(字段名) AGAINST (‘检索的具体值‘)

1.行级锁有如下两种。

共享锁:容许事务读一行数据。

排它锁:容许事务删除或更新一行数据。如有其余事务想得到排它锁,必须等原来的事务释放锁。

2.锁的相关表。information_schema架构下的表INNODB_TRX,INNODB_LOCKS,INNODB_LOCK_WAITS。

命令:SHOW ENGINE INNODB STATUS。

一致性非锁定读

1.指的是经过多行版本控制的方式读数据库。若是读取的行正在执行变动操做,这时不会等待锁释放。相反,INNODB引擎会去读取行的一个快照数据。

之因此成为非锁定读,是由于不须要等待访问的行的锁释放。

2.在READ COMMITTED事务隔离级别下,对于快照数据,非一致性读老是读取被锁定的行的最新一份快照数据。在REPEATABLE READ事务隔离级别下,对于快照数据,非一致性读老是读取事务开始时的行数据版本。

3.在事务的默认配置下,事务的隔离级别为REPEATABLE READ模式。INNODB存储引擎的SELECT操做,使用一致性非锁定读。

一致性锁定读

1.一致性锁定读,对数据库的读操做进行加锁以保证数据逻辑的一致性。
好比如今有两个线程,A线程读时另B线程改变了数据,那么在READ COMMITED隔离级别下,A线程第二次读到的是最新的数据。

2.锁定读有两种。SELECT ... FOR UPDATE和SELECT... LOCK IN SHARE MODE。

3.一致性锁定读,SELECT FOR UPDATE对读取的行记录加入一个X锁(排它锁),其余事务不能对已锁定的行加任何锁。

而对于一致性非锁定读,即便读取的行已经执行了SELECT FOR UPDATE,也是能够读取的。

4.SELECT...IN SHARE MODE对读取的行记录加上一个S锁,其余事务能够向被锁定的行加S锁,可是若是是加X锁,则会被阻塞。

锁问题

脏读

脏读:脏数据是指未提交的数据。脏读是指在不一样的事务下,当前事务能够读到另外事务未提交的数据。这显然违反了数据库的隔离性。

脏读发生的事务隔离级别:READ UNCOMMITED。

不可重复读

不可重复读:在一个事务内两次读到的数据不同。好比,A事务尚未结束,B事务对同一数据进行修改,因为B事务的修改,那么A事务两次读到的数据是不同的。违背了数据库事务一致性的要求。

不可重复读,读到的是已经提交的数据。

不可重复读,发生的隔离级别是READ COMMITTED。

ORACLE默认的隔离级别也是READ COMMITTED。

幻读

幻读:A事务读取了B事务已经提交的新增数据。

丢失更新

丢失更新,是指一个事务的更新操做会被另外一个事务的更新操做覆盖。

死锁

1.死锁是指两个或两个以上的事务,在执行过程当中,因争夺资源而形成的一种互相等待的现象。

2.死锁解决方法:超时机制。

3.死锁检测:等待图。

疑惑

1.为何Mysql索引,使用的数据结构,必须有序?

由于顺序读远远快于离散读。

为何在B+树中新增数据,也要保证有序?

有序才能更快地找到存储的内容。

B+树还能用于磁盘。。

2.为何要用B+树?

B+树又"矮"又"胖",可以更快地查找到内容。

3.B+树为何要把数据全放在叶子节点上面呢?

节点存储的内容是有限的,只存放指针可以使节点的高度更矮,可以更快地查找到内容。

4.联合索引的最左匹配原则,究竟是什么?

联合索引的数据结构,是怎样的?

5.为何散列表(哈希表)数据放到一个链表中就能减小碰撞?

6.数据库锁,java的锁,和操做系统的锁,是否原理都是同样的??

7.锁是怎么处理多个事务的? A事务开启后未提交,B事务进行其余操做,会有怎样的结果?(一致性非锁定读)

相关文章
相关标签/搜索