4种常见的数据库索引

数据库索引是优化数据库系统性能的关键组成部分。如果没有有效的索引,查询可能会变得缓慢且低效,从而导致用户体验不佳并降低生产力。在这篇文章中,我们将探讨创建和使用数据库索引的一些最佳实践。

常见的索引算法有:

1. B-Tree

B-Tree 是一种自平衡树的数据结构,可保持数据的排序并允许在对数时间复杂度内搜索数据、插入数据和删除数据。B-Tree索引广泛应用于MySQL、PostgreSQL等关系数据库中。
请添加图片描述
B-Tree 针对范围查询进行了优化,由于记录在索引中按排序顺序存储,故而可以有效地查找某个范围内的所有记录。使用 =、>、>=、<、<= 或 BETWEEN 运算符的表达式中会充分发挥其性能。

在 B-Tree 索引中查询如下:

  • 数据库从树的根部开始,将搜索关键字与当前节点的关键字的值进行比较。
  • 如果相等,则数据库返回该记录。
  • 否则,数据库根据比较结果确定下一步要搜索的子树。

例如,假设我们有一个具有以下架构的产品表:

CREATE TABLE products (id INT PRIMARY KEY,name VARCHAR(255),price DECIMAL(10,2)
);

使用以下命令在price列上创建 B-Tre索引:

CREATE INDEX products_price_index ON products (price);

2. 哈希索引

哈希索引是另一种流行的索引算法,用于加速查询。哈希索引使用哈希函数将键映射到索引位置。此算法对于精确匹配查询最有用,例如根据主键值搜索特定记录。哈希索引通常用于内存数据库,例如 Redis。

哈希索引的工作原理是根据哈希值将表中的每条记录映射到唯一的存储桶。哈希值是使用哈希函数计算的。
请添加图片描述
为了在哈希索引中查找记录,数据库首先计算搜索键的哈希值,然后查找相应的存储位置。如果该记录在存储位置处,则数据库将返回该记录。否则,数据库执行全表扫描。

哈希索引的查找速度非常快,但它们不适用于数据范围查询。这是因为哈希函数不保留表中记录之间的任何顺序。

哈希索引查询如下:

  1. 数据库计算查询条件的哈希值
  2. 在哈希表中查找对应的哈希桶
  3. 然后数据库检索指向表中具有相应哈希值的行的指针
  4. 使用这些指针从表中检索实际行

假设我们有一个具有以下的产品表:

CREATE TABLE products (id INT PRIMARY KEY,name VARCHAR(255),price DECIMAL(10,2)
);

我们可以使用以下命创建哈希索引:

CREATE INDEX products_name_hash ON products (name);
SELECT * FROM products WHERE name = 'iPhone 13 Pro';

3. B-Tree 对比 哈希索引

在以下情况下,哈希索引并不适用:

  • 范围查询:哈希索引未针对范围查询进行优化,查找某个值范围内的记录(使用 =、>、>=、<、<= 或 BETWEEN 运算符)。在这种情况下,B-Tree索引会更合适。
  • 结果排序:哈希索引未针对排序结果进行优化,需要根据特定列对记录进行排序。在这种情况下,B-Tree索引会更合适。
  • 大型数据集:哈希索引会占用大量内存,因此不适合需要考虑内存使用情况的大型数据集。

4. 位图索引(Bitmap Index)

位图索引用于具有少量不同值的列,例如布尔值的列或性别列。位图索引对应数值范围较少的列来说非常紧凑且高效。

SELECT * FROM employees WHERE gender = 'Female';

5. 全文索引

全文索引用于索引大量文本数据,例如文档或网页。该索引算法将文本分解为单词或标记,并以允许高效搜索操作的方式对它们进行索引。全文索引对于涉及在文本中搜索特定单词或短语的查询最有用。全文索引通常用于 Elasticsearch 等搜索引擎。

通过全文索引,电子商务应用程序可以根据用户输入的搜索查询快速搜索大型产品目录。全文索引允许基于多个单词和短语进行搜索,包括拼写错误、同义词,甚至相关概念。这使得用户更容易找到他们正在寻找的东西,即使他们不知道确切的产品名称或描述。

例如,假设一位顾客正在寻找一双新的跑鞋。他们在搜索栏中输入“跑鞋”。通过全文索引,电子商务应用程序可以快速搜索所有产品描述、名称和标签,以查找与跑鞋相关的所有产品。搜索结果将根据相关性进行排序,相关性由搜索词在产品信息中出现的频率决定。
如果没有全文索引,搜索可能只会查看产品名称,而无法考虑可能与客户相关的其他因素,例如产品描述或标签。此外,搜索可能无法处理拼写错误或相关概念,例如“慢跑鞋”或“运动鞋”。

假设我们有一个名为 products 的表,其中包含以下列:id、名称、描述和标签。

CREATE FULLTEXT INDEX products_ft_index ON products(name, description, tags);

现在,假设一位顾客搜索“跑鞋”。我们可以使用以下查询来搜索与搜索词相关的产品:

ELECT id, name, description, MATCH(name, description, tags) AGAINST('running shoes') as relevance
FROM products
WHERE MATCH(name, description, tags) AGAINST('running shoes' IN BOOLEAN MODE)
ORDER BY relevance DESC

请添加图片描述

上图最后一列是相关性分数,表示每个产品与搜索词的匹配程度,分数越高匹配越接近,搜索结果根据相关性分数按降序排序,因此相关性得分最高的产品(耐克跑鞋)显示在列表顶部。
下面是另一个示例查询,用于搜索包含“organic”和“coffee”一词的产品:

SELECT id, name, description, MATCH(name, description, tags) AGAINST('+"organic" +"coffee"') as relevance
FROM products
WHERE MATCH(name, description, tags) AGAINST('+"organic" +"coffee"' IN BOOLEAN MODE)
ORDER BY relevance DESC;

该查询搜索名称、描述或标签列中同时具有“organic”和“coffee”关键字的所有产品。每个结果的相关性得分也是根据关键字在列中出现的次数和位置来计算的。
输出结果包含“id”、“name”、“description”和“relevance”列,结果按“relevance”列降序排列。
请添加图片描述

全文索引的优点:

  • 全文索引对于基于文本的列非常有效
  • 非常适合搜索引擎和内容管理系统
  • 支持搜索结果的相关性排序

全文索引的缺点:

  • 全文索引会占用大量存储空间
  • 对于非常大的数据集,性能可能会下降
  • 全文索引不适合数字或分类数据

6. 总结

本文介绍了数据库常见的4种索引和其原理,包括B-Tree索引,哈希索引,位图索引和全文索引,每种索引都有自己的特点,在实际中请根据业务场景选择适合的索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop入门学习笔记——二、在虚拟机里部署HDFS集群

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 二、在虚拟机里部署HDFS集群2.1. 部署node1虚拟机2.2. 部…

【Angular】Angular中的最差实践

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习

上一篇中我们进行了散列表的相关练习&#xff0c;在这一篇中我们要学习的是并查集。 目录 概念伪代码选择题填空题编程题7-1 朋友圈R7-1 笛卡尔树R7-2 部落R7-3 秀恩爱分得快 在许多实际应用场景中&#xff0c;我们需要对元素进行分组&#xff0c;并且在这些分组中进行查询和修…

常用Python自动化测试框架有哪些?优缺点对比

随着技术的进步和自动化技术的出现&#xff0c;市面上出现了一些自动化测试框架。只需要进行一些适用性和效率参数的调整&#xff0c;这些自动化测试框架就能够开箱即用&#xff0c;大大节省了测试时间。而且由于这些框架被广泛使用&#xff0c;他们具有很好的健壮性&#xff0…

Python 运算符 算数运算符 关系运算符 赋值运算符 逻辑运算 (逻辑运算符的优先级) 位运算 成员运算符 身份运算符 运算符的优先级

1 运算符算数运算符关系运算符赋值运算符逻辑运算逻辑运算符的优先级 位运算布尔运算符移位运算符 成员运算符身份运算符运算符的优先级 运算符 算数运算符 四则运算 - * / a 8 b 9 print(ab)#与Java类似 也可以进行字符串的连接 注意:字符串数字字符串 不存在会抛出异常…

车云TCP链路偶现链接失联问题排查

一、问题分析 1.1 车云tcp长连接分析排查 在15:37:32.039上线&#xff0c; 在 16:07:26.527下线&#xff0c;车云长连接通道稳定&#xff0c;且该期间心跳数据正常。 1.2 云向驾仓推送数据分析 在15:37:42 进行车辆接管后&#xff0c;该车辆下线&#xff0c;且无法在上线&am…

SQL变更评审常见问题分享

SQL变更评审分享 概述 SQL变更&#xff0c;是我们在开发迭代中不可避免的场景&#xff0c;SQL变更通常是指DDL和DML语句变更&#xff0c;这些sql会影响到数据库表结构或具体数据&#xff0c;变更时如果执行到存在问题的sql脚本&#xff0c;会对实际应用操作难以评估的损失&…

Java研学-Servlet 基础

一 概述 1 介绍 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称&#xff0c;称为小服务程序或服务连接器&#xff0c;用Java编写的服务器端程序&#xff0c;具有独立于平台和协议的特性&#xff0c;主要功能在于交互式地浏览和生成数据&#xff0c;生成动…

会员管理怎么做?

会员管理是企业运营的重要组成部分&#xff0c;它涉及到会员的招募、维护、激励、保留、转化等多个环节。下面&#xff0c;我们将结合具体的案例&#xff0c;详细介绍会员管理的具体做法。 首先&#xff0c;会员的招募是会员管理的第一步 企业需要通过各种方式吸引消费者成为会…

3D数字化系统建设

以3D可视化、数字化技术为基础&#xff0c;其实&#xff0c;很多传统的系统软件都可以重新做一下。 比如&#xff1a;以下这个使用场景&#xff1a;零售门店陈列&#xff1b; 还有&#xff0c;数字化仓储系统&#xff0c;3D数字化供应链系统&#xff0c;3D数字化的生产系统&a…

redis常见数据类型

目录 1.基本全局命令 2.数据结构和内部编码 3.单线程架构 1.基本全局命令 Redis有5种数据结构,但它们都是键值对种的值&#xff0c;对于键来说有一些通用的命令。 KEYS 返回所有满足样式(pattern) 的key。支持如下统配样式。 h?llo 匹配 hello, hallo和hxllo h*llo匹配h…

基于SpringBoot实现的前后端分离书店项目,功能:注册登录、浏览商品、热门商品、购物车、购买、地址管理、密码管理等

一、项目简介 本项目主要基于SpringBoot、Mybatis-plus、MySQL、Redis实现的书店管理系统。 本系统是前后端分离的&#xff0c;分别由三个子项目构成&#xff1a;java服务端、用户浏览与购买的前端、管理员管理商品的前端 环境 java 1.8mysql8.0redisvue2.x 管理员子系统功…

Ubuntu 常用命令之 ps 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 ps命令是Linux下的一个非常重要的命令&#xff0c;它用于查看系统中的进程状态。ps是Process Status的缩写&#xff0c;可以显示系统中当前运行的进程的状态。 以下是一些常用的参数 a&#xff1a;显示所有进程&#xff08;包括…

string的库函数reserve、resize

系列文章 http://t.csdnimg.cn/u80hL 目录 系列文章[TOC](目录) 一、reserve——请求容量的变化二、resize——操作对象使用的空间 一、reserve——请求容量的变化 改变对象的capacity——他会请求开辟和缩小对象所占的空间&#xff0c;reserve只能操作对象未使用的空间&…

单例模式实现

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;JavaEE &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 单例模式 1. 什么是单例模式2. 饿汉模式3.…

C语言易错知识点九(指针(part three))

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 许久不见&#xff0c;甚是想念&#xff0c;本大忙人已经很久没有更新博客了&#xff0c;我想大概我的粉丝们早…

Linux的/proc/self/学习

文章目录 /proc目录/proc/self的使用 在做SSTI模板注入的CTF题中&#xff0c;发现有师傅提到可以用/proc/self这个目录获取flag&#xff0c;所以也来学习一波主要参考. (我才知道&#x1f601;&#x1f601;&#x1f601;)可以通过/proc/$pid/来获取指定进程的信息&#xff0c…

Kioptrix-3

靶场下载地址 https://download.vulnhub.com/kioptrix/KVM3.rar 信息收集 # Nmap 7.94 scan initiated Thu Dec 21 21:52:25 2023 as: nmap -sn -oN live.nmap 192.168.1.0/24 Nmap scan report for 192.168.1.1 (192.168.1.1) Host is up (0.00048s latency). MAC Address:…

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

【Element】el-table 使用 el-table-infinite-scroll 插件实现滚动加载

虽然 el 官方提供了 Infinite Scroll 无限滚动 组件 但是却不支持 el-table 组件&#xff0c;这就很难受了&#xff0c;还好已经有大佬写好了插件&#xff0c;并且支持 element-plus/infinite-scroll 组件的所有选项。 el-table-infinite-scroll el-table-infinite-scroll 看…