数据库搜索引擎介绍

1、 索引

1.1 、索引的定义及优缺点

索引的定义:索引是对数据库表的一列或者多列的值进行排序一种结构,使用索引可以快速访问数据表中的特定信息。

通俗来讲,索引就是数据库表的一个目录,通过索引,我们可以迅速的找到数据库中的数据,并进行相应的增删改查等操作。

索引的使用大大加快数据检索的速度,将随机I/O变成顺序I/O(因为B+树的叶子节点是连接在一起的),加速表与表之间的连接,使得我们查询数据更为方便,因此我们在执行数据库查询时,基本离不开索引,但与此同时,他也有一定缺点,从空间角度考虑,建立索引需要占用物理空间,其会占用计算机的内存,因而我们在数据库优化时会尽量减少索引的建立;从时间角度考虑,创建和维护索引都需要花费时间,例如对数据进行增删改的时候都需要维护索引,因此在创建索引时,我们应当要注意不能创建太多索引。

1.2 索引的数据结构

索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。一般来说,我们在查询时更多的是用B+数,其原因是其查找的效率非常高,并且支持排序和范围查找;哈希索引一般多用于精确的等值查找。

MySQL主要的索引类型主要有FULLTEXT,HASH,BTREE,RTREE。

FULLTEXT:FULLTEXT即全文索引,MyISAM存储引擎和InnoDB存储引擎在MySQL5.6.4以上版本支持全文索引,一般用于查找文本中的关键字,而不是直接比较是否相等,多在CHAR,VARCHAR,TAXT等数据类型上创建全文索引。全文索引主要是用来解决WHERE name LIKE "%zhang%"等针对文本的模糊查询效率低的问题。

HASH:HASH即哈希索引,哈希索引多用于等值查询,时间复杂夫为o(1),效率非常高,但不支持排序、范围查询及模糊查询等。

BTREE:BTREE即B+树索引,INnoDB存储引擎默认的索引,支持排序、分组、范围查询、模糊查询等,并且性能稳定。

RTREE:RTREE即空间数据索引,多用于地理数据的存储,相比于其他索引,空间数据索引的优势在于范围查找

1.1.3、索引的分类

       1、唯一索引: 是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中不可以重复。

  2、非唯一索引: 是在表上一个或者多个字段组合建立的索引,这个或者这些字段的值组合起来在表中可以重复,不要求唯一。

  3、主键索引(主索引): 是唯一索引的特定类型。表中创建主键时自动创建的索引,一个表只能建立一个主索引。

  4、聚集索引(聚簇索引、Innodb):表中记录的物理顺序与键值的索引顺序相同。 因为真实数据的物理顺序只有一种,所以一个表只能有一个聚集索引。叶子节点(B+树)存储真实的数据行,不再有另外单独的数据页。

  5、非聚集索引(Mylsam):表中记录的物理顺序与键值的索引顺序不同。这也是非聚集索引与聚集索引的根本区别。叶子节点并非数据节点,而是每一个指向真正数据行的指针。

  

聚簇索引和非聚簇索引最主要的区别是数据和索引是否分开存储

  • 聚簇索引:将数据和索引放到一起存储,索引结构的叶子节点保留了数据行。
  • 非聚簇索引:将数据进和索引分开存储,索引叶子节点存储的是指向数据行的地址。

2 数据库引擎

2.1 数据库引擎的定义及理解

数据库引擎简单来说就是一个"数据库发动机"。当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是 通过数据库引擎去访问数据库文件。以关系型数据库为例,你发SQL语句给数据库引擎, 数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。正式来说,数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可以 控制访问权限并快速处理事务,从而满足企业内大多数需要 处理大量数据的应用程序的要求,这包括 创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)

 参见blog:(176条消息) 数据库引擎学习总结_gentelyang的博客-CSDN博客_数据库引擎

2.2、数据库引擎的任务

1:设计并创建数据库以保存系统所需要的关系或xml文档

2:实现系统以访问或更改数据库中存储的数据,实现网站或使用数据的应用程序,包括使用SOL Server工具和使用工具已使用数据的过程。

3:为单位或用户部署实现的系统

4:提供日常管理支持优化数据库的性能。

2.3、引擎的类别

常见的数据库引擎类别包括ISAM、MYISAM,HEAP和INNODB,其是mysql数据库的有机组成部分,在数据查询中起到了非常重要的作用。其详细介绍如下:

ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

MyISAM
MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的MyISAMPack工具。

HEAP
HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。

InnoDB和Berkley DB
InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

2.4、InnoDB引擎和MyISAM引擎的区别

在InnoDB存储引擎中,默认的索引为B+树索引,利用主键创建的索引为主索引,也是聚簇索引,在主索引之上创建的索引为辅助索引,也是非聚簇索引。为什么说辅助索引是在主索引之上创建的呢,因为辅助索引中的叶子节点存储的是主键。

在MyISAM存储引擎中,默认的索引也是B+树索引,但主索引和辅助索引都是非聚簇索引,也就是说索引结构的叶子节点存储的都是一个指向数据行的地址。并且使用辅助索引检索无需访问主键的索引。

3 数据库事务

3.1、事务的四大特性

原子性:事务是最小的执行单位,要么全部执行,要么全部不执行

一致性:执行事务前后,数据保持一致,多个事务读取的结果是相同的

隔离性:并发访问数据时,一个用户事务不会被其他事务所干扰

持久性:事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

3.2 事务的隔离级别

事务的隔离级别共有四种,包括读未提交、读以提交、可重复读、可序列化,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

Read uncommitted 读未提交:事务B读取了事务A尚未提交的数据,可能出现脏读

Read committed 读提交:事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变,避免了脏读,但是可能会造成不可重复读

Repeatable read 重复读: ,避免了不可重复读,但还有可能出现幻读。注:MySQL的默认隔离级别就是Repeatable read。

Serializable 序列化:Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻像读。

1.3.3、重复读与幻读

重复读是为了保证在一个事务中,相同查询条件下读取的数据值不发生改变,但是不能保证下次同样条件查询,结果记录数不会增加。

幻读就是为了解决这个问题而存在的,他将这个查询范围都加锁了,所以就不能再往这个范围内插入数据,这就是SERIALIZABLE 隔离级别做的事情。

4 、索引,引擎和事务的联系

4.1 三者的关系

通俗来说,索引是数据库查询,编写数据的一个目录,引擎可以说是数据库与外界交互的一个工具,而事务则是决定数据库与外界业务交付的最小单位。通过对于数据库索引,引擎以及事务的认识,我们才能更清楚了解和掌握数据库是如何使用的。也可以通过此来了解和掌握mysql以及和mysqls数据库相关的事务,也能更清楚如何对sql语句进行优化以及优化数据库表。

4.2.mysql中的数据库索引以及引擎

MySQL主要的索引类型主要有FULLTEXT,HASH,BTREE,RTREE。分别是全文索引,哈希索引,B+树索引,以及即空间数据索引,他们共同构成了数据库的INnoDB,MYISAM以及HEAP等基本存储引擎和查找引擎,也使得数据库有众多功能,可以支持排序、分组、范围查询、模糊查询等操作,使得数据可以发挥其生产力。

而其与外界交互的sql语句则共同组成了一个个事务,使得数据的操作成为一个个完整的事件,从而能够通过组合来反映我们世界的变化,从而助力与我们生活中的方方面面,发挥其独特的功能。比如通过mysql中表格数据的不同查询条件,我们可以得出和筛选出不同人的得分情况,从而

4.3 其他数据库的设计以及思考

4.3 .1 Oracle数据库的引擎

oracle中不存在引擎的概念,数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

OLTP和OLAP的区别

OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;
OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。 

 

参见blog:https://blog.csdn.net/cafucwxy/article/details/78319414

4.3.2 Sqlite数据库设计

sqlite数据库设计是以零配置而生效的,具有可兼得性,

4.3.3 redis数据库

4.3.4 mongoDB

4.3.5 hBase数据库

5.数据库优化策略

1、索引优化

2、分库分表

3、其他

参考资料:https://blog.csdn.net/lydon1314/article/details/121479989

Published by

风君子

独自遨游何稽首 揭天掀地慰生平