笔记_数据库相关

mysql的索引也叫“键(key)”,是存储引擎用于快速找到记录的一种数据结构。

mysql索引的工作方式:(根据查询条件)先在索引中找对应值,然后根据匹配的索引记录找到对应的数据行。

mysql中索引是在存储引擎层实现不是在服务器层实现,故没有统一的索引标准,不同引擎的索引的工作方式并不相同。

根据数据结构的实现,分为b-tree索引,哈希索引

b-tree索引

多数mysql引擎都支持b-tree索引,archive引擎是例外,5.1之前archive不支持任何索引,5.1之后才开始支持单个自增列(AUTO_INCREMENT)的索引

值安顺序存储,每个叶子叶到根距离相同

哈希索引基于哈希表实现

聚簇索引:索引和数据放在一起。InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行

非聚簇索引:索引与数据分开了。这类索引就是,myisam索引

                                Read Uncommitted(读取未提交内容)所有事务都可以看到其他未提交事务的执行结果

脏读(Dirty Read)

Read Committed(读取提交内容)多数默认

一个事务只能看见已经提交事务所做的改变

不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果

Repeatable Read(可重读)

      这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行

幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

Serializable(可串行化) 
       这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁

 

mysql的索引也叫“键(key)”,是存储引擎用于快速找到记录的一种数据结构。

mysql索引的工作方式:(根据查询条件)先在索引中找对应值,然后根据匹配的索引记录找到对应的数据行。

mysql中索引是在存储引擎层实现不是在服务器层实现,故没有统一的索引标准,不同引擎的索引的工作方式并不相同。

根据数据结构的实现,分为b-tree索引,哈希索引

b-tree索引

多数mysql引擎都支持b-tree索引,archive引擎是例外,5.1之前archive不支持任何索引,5.1之后才开始支持单个自增列(AUTO_INCREMENT)的索引

值安顺序存储,每个叶子叶到根距离相同

哈希索引基于哈希表实现

 

数组

使用场景

数组在以下三个情形下很有用:

1)数据量较小。

2)数据规模已知。

3)随机访问,修改元素值。

如果插入速度很重要,选择无序数组。如果查找速度很重要,选择有序数组,并使用二分查找。

缺点

1)需要预先知道数据规模

2)插入效率低,因为需要移动大量元素。

链表

解决的问题

链表的出现解决了数组的两个问题:

1)需要预先知道数据规模

2)插入效率低

使用场景

1)数据量较小

2)不需要预先知道数据规模

3)适应于频繁的插入操作

缺点

1)有序数组可以通过二分查找方法具有很高的查找效率(O(log n)),而链表只能使用顺序查找,效率低下(O(n))。

二叉查找树

解决的问题

1)有序数组具有较高的查找效率(O(log n)),而链表具有较高的插入效率(头插法,O(1)),结合这两种数据结构,创建一种貌似完美的数据结构,也就是二叉查找树。

使用场景

1)数据是随机分布的

2)数据量较大

3)频繁的查找和插入操作(可以提供O(log n)级的查找、插入和删除操作)

缺点

1)如果处理的数据是有序的(升序/降序),那么构造的二叉查找树就会只有左子树(或右子树),也就是退化为链表,查找效率低下(O(logn))。

平衡树

解决的问题

1)针对二叉查找树可能会退化为链表的情况,提出了平衡树,平衡树要求任意节点的左右两个子树的高度差不超过1,避免退化为链表的情况。

使用场景

1)无论数据分布是否随机都可以提供O(log n)级别的查找、插入和删除效率

2)数据量较大

缺点

1)平衡树的实现过于复杂。

哈希表

解决的问题

同平衡树一样,哈希表也不要求数据分布是否随机,不过哈希表的实现比平衡树要简单得多。

使用场景

1)不需要对最大最小值存取。

2)无论数据分布是否随机,理想情况下(无冲突)可以提供O(1)级别的插入、查找和删除效率。

3)数据量较大

缺点

1)由于是基于数组的,数组(哈希表)创建后难以扩展,使用开放地址法的哈希表在基本被填满时,性能下降的非常严重。

2)不能对最大最小值存取。

通用数据存储结构

专用数据结构

顺序栈

优点

1)在输入数据量可预知的情形下,可以使用数组实现栈,并且数组实现的栈效率更高,出栈和入栈操作都在数组末尾完成。

缺点

1)如果对数组大小创建不当,可能会产生栈溢出的情况

链栈

优点

1)不会发生栈溢出的情况

2)输入数据量未知时,使用链栈。通过头插法实现入栈操作,头删法实现出栈操作。出栈和入栈均是O(1)。

缺点

1)由于入栈时,首先要创建插入的节点,要向操作系统申请内存,所以链栈没有顺序栈效率高。

队列

如果数据量已知就使用数组实现队列,未知的话就使用链表实现队列。出队和入队均是O(1)。

猜你喜欢

转载自blog.csdn.net/feicongcong/article/details/78485623