首页 > 编程知识 正文

如何减少hash碰撞,数据库原理与应用笔记

时间:2023-05-04 15:18:41 阅读:9435 作者:2500

第一章MySql存储引擎

1.Innodb存储引擎

支持事务。 其特点是行锁的设计、外键的支持。

Innodb是Mysql的默认存储引擎。

2.MyISAM存储引擎

MyIsam存储引擎不支持事务和表锁的设计,MyIsam也不支持外键,但支持全文索引。

第五章索引与算法

1 .一般索引: b树索引、全文索引、哈希索引。

2.B树是由两股找木、平衡二叉树、b树进化而来的。

两股检索树

二叉树:左边部分树的值总是小于根的值,右边部分树的值总是大于根的值。 通过中顺扫描可以得到值的排序输出。

平均寻道速度比逐次寻道快。

二叉树平衡(AVL树() ) ) )。

平衡二叉树:首先符合二叉树搜索树的定义,然后必须满足哪个节点这两个子树高度的最大差别为1。

b树

b树—为磁盘和其他直接访问辅助设备设计的平衡树。

在b树中,所有记录节点按照键值对的大小顺序存储在同一层次的叶节点中,并通过各叶节点指针连接。

好处:B的树高一般在2--4楼。 也就是说,查找某个键值的行记录时,最多只需2--4次I/o即可。

b树索引

b树索引。 分为聚合索引和辅助索引。

聚合索引和辅助索引的区别:叶子节点是否包含整行信息。

聚集索引

合计索引:根据各表的主键构建b树,在叶节点中存储整个表的行记数据。 另外,将统计索引的叶的节点也称为数据页。

辅助索引

辅助索引:叶节点并不包含行记录中的所有数据。 除了键值之外,叶节点还在每个叶节点的索引行中包含书签" bookmark "。 此书签用于向Innodb存储引擎通知与索引对应的行数据的位置。 辅助索引书签是相应行数据的集合索引关键字。

货币值

1.SHOW INDEX FROM表名

:此语句可以显示表的索引信息。

2.Cardinality值非常重要,优化程序根据该值确定是否使用此索引。

在性别、地域类型字段中,取值范围较小,称为“低选择性”,不需要使用b树索引。

Cardinality值,指示索引中不重复记录数的估计值。 在实际运用中,Cardinality尽量接近1。 如果非常小,用户应该考虑是否需要创建这个索引。

扩展插件

可以显示查询的类型和索引。

PROSSIBLE_KEY :可能的索引。

KEY:的实际索引。

联合索引

1 .合并索引是指索引表中的多个列。

2 .联盟索引也是b树,但联盟索引的键值数量大于或等于2,而不是1。

联合索引中的所有键值都将被排序。 可以通过叶节点逻辑上依次读取所有数据。

数据存储在[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 * fromtablewherea=xxxorderbyb

select * fromtablewherea=XXX andb=xxxorderbyc

但是,下一个不行。

select * fromtablewherea=xxxorderbyc

涵盖索引

1.InnoDBd存储引擎支持覆盖索引。 这意味着可以从次索引中检索查询的记录,而不必查询聚合索引中的记录。

使用覆盖索引的一个优点是,辅助索引不包含整个记录的所有信息,因此其大小远远小于聚合索引,从而减少了大量I/o操作。

其他

1.fic :快速索引创建。

2 .在线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事务进行其他操作,会有怎样的结果?(一致性非锁定读)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。