高级java每日一道面试题-2024年9月29日-数据库篇-索引怎么定义,分哪几种?
如果有遗漏,评论区告诉我进行补充
面试官: 索引怎么定义,分哪几种?
我回答:
在Java高级面试中,尤其是涉及数据库和数据结构的部分,索引(Index)是一个核心概念。索引的目的是提高数据库表中数据的检索速度,从而加快数据库查询、更新等操作的执行效率,特别是在处理大量数据时。不过,需要明确的是,索引通常是在数据库层面定义的,而不是直接在Java代码中定义(Java代码主要通过SQL语句来操作数据库,包括创建和管理索引)。但理解索引的原理和类型对于任何使用数据库的Java开发者都是非常重要的。
索引的定义
索引是一种数据结构,在数据库中用于帮助快速找到表中某一行的辅助数据结构。索引可以建立在数据库表的一列或多列上,它是数据库管理系统自动创建的表之外的隐藏对象。使用索引后,数据库系统不必扫描整个表,就能迅速定位到某条记录的位置。
索引的分类
索引可以根据不同的标准进行分类,主要包括以下几种:
按基本功能分类:
- 单列索引:只包含表中一个字段的索引。
- 复合索引(或多列索引):包含表中两个或两个以上字段的索引。创建复合索引时,会考虑索引中列的顺序。
- 唯一索引:保证索引列的值唯一的索引。在唯一索引中,表中任意两行在索引列上的值都不能相同。
- 主键索引:是表中的一列或多列的组合,其值能唯一地标识表中的每一行。实际上,主键索引就是一种特殊的唯一索引,且不允许有NULL值。
按字段数量分类
- 单列索引:仅包含一个列的索引。
- 复合索引(也称组合索引或多列索引):包含多个列的索引。复合索引的列顺序非常重要,因为它会影响查询性能。
按唯一性分类
- 唯一索引:确保索引列中的所有值都是唯一的。
- 非唯一索引:允许索引列中有重复的值。
按物理存储方式分类:
- B-Tree索引:最常用的索引类型之一,适用于范围查询和排序。
- Hash索引:基于哈希函数的索引,适用于等值查询。
- Bitmap索引:使用位图表示数据的存在性,适用于低基数列(即列中唯一值较少的情况)。
- R-Tree索引:适用于多维空间数据,如地理信息系统(GIS)。
- 全文索引:主要用于搜索文本中的关键字,而不是直接比较索引中的值。
按逻辑角度分类
- 聚集索引(Clustered Index):在关系型数据库中,聚集索引决定了数据行的物理存储顺序。每个表只能有一个聚集索引。
- 非聚集索引(Non-Clustered Index):不改变数据行的物理存储顺序,而是创建一个单独的数据结构来加速查询。每个表可以有多个非聚集索引。
按存储方式分类
- 内存索引:索引数据完全存储在内存中,适用于高速读取。
- 磁盘索引:索引数据存储在磁盘上,适用于大规模数据集。
详解
B-Tree索引
- 特点:
- 平衡树结构,所有叶子节点在同一层。
- 支持范围查询和排序。
- 插入、删除和查找操作的时间复杂度为O(log n)。
- 适用场景:
- 范围查询(如
WHERE column BETWEEN ... AND ...
)。 - 排序查询(如
ORDER BY column
)。
- 范围查询(如
Hash索引
- 特点:
- 基于哈希函数计算键值的位置。
- 查找速度快,平均时间复杂度为O(1)。
- 不支持范围查询和排序。
- 适用场景:
- 等值查询(如
WHERE column = 'value'
)。
- 等值查询(如
Bitmap索引
- 特点:
- 使用位图表示数据的存在性。
- 非常适合低基数列(如性别、状态等)。
- 占用空间小,查询速度快。
- 适用场景:
- 低基数列的查询。
R-Tree索引
- 特点:
- 适用于多维空间数据。
- 用于地理信息系统(GIS)中的空间查询。
- 适用场景:
- 多维空间数据查询(如地图应用中的点、线、面查询)。
复合索引
- 特点:
- 包含多个列的索引。
- 列的顺序非常重要,前导列的选择会影响查询性能。
- 适用场景:
- 经常需要同时查询多个列的情况。
唯一索引
- 特点:
- 确保索引列中的所有值都是唯一的。
- 可以作为主键的一部分。
- 适用场景:
- 需要保证列值唯一性的场景。
聚集索引与非聚集索引
- 聚集索引:
- 决定了数据行的物理存储顺序。
- 每个表只能有一个聚集索引。
- 非聚集索引:
- 不改变数据行的物理存储顺序。
- 创建一个单独的数据结构来加速查询。
- 每个表可以有多个非聚集索引。
示例
假设我们有一个 employees
表,包含以下列:id
, name
, department_id
, salary
。
CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,salary DECIMAL(10, 2)
);
创建索引
-
单列索引:
CREATE INDEX idx_name ON employees(name);
-
复合索引:
CREATE INDEX idx_department_salary ON employees(department_id, salary);
-
唯一索引:
CREATE UNIQUE INDEX uidx_email ON employees(email);
-
聚集索引:
在MySQL中,主键默认是聚集索引。ALTER TABLE employees ADD PRIMARY KEY (id);
-
非聚集索引:
CREATE INDEX idx_salary ON employees(salary);
注意
- 索引虽然能加速数据检索,但也会消耗额外的磁盘空间,并降低写操作的性能(因为插入、删除和更新操作时需要同时修改表和索引)。
- 在设计索引时,需要综合考虑数据的查询频率、修改频率、空间使用、数据分布等因素。
总结
索引是提高数据库查询性能的重要工具。根据不同的需求和场景选择合适的索引类型至关重要。在设计索引时,需要考虑以下几点:
- 数据量大小
- 查询模式(范围查询、等值查询等)
- 更新频率
- 存储空间
通过合理地设计和使用索引,可以显著提高应用程序的性能。
相关文章:
高级java每日一道面试题-2024年9月29日-数据库篇-索引怎么定义,分哪几种?
如果有遗漏,评论区告诉我进行补充 面试官: 索引怎么定义,分哪几种? 我回答: 在Java高级面试中,尤其是涉及数据库和数据结构的部分,索引(Index)是一个核心概念。索引的目的是提高数据库表中数据的检索速度,从而加快…...

现代LLM基本技术整理
0 开始之前 作者:hadiii,北京大学 电子信息硕士在读 本文从Llama 3报告出发,基本整理一些现代LLM的技术。基本,是说对一些具体细节不会过于详尽,而是希望得到一篇相对全面,包括预训练,后训练&…...

EasyX与少儿编程:轻松上手的编程启蒙工具
EasyX:开启少儿编程的图形化启蒙之路 随着科技发展,编程逐渐成为孩子们教育中重要的一部分。如何让孩子在编程启蒙阶段更容易接受并激发他们的兴趣,成为许多家长和老师关心的问题。相比起传统的编程语言,图形化编程工具显得更直观…...

【C语言指南】数据类型详解(上)——内置类型
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C语言指南》 期待您的关注 目录 引言 1. 整型(Integer Types) 2. 浮点型(Floating-Point …...

视频汇聚/视频存储/安防视频监控EasyCVR平台RTMP推流显示离线是什么原因?
视频汇聚/视频存储/安防视频监控EasyCVR视频汇聚平台兼容性强、支持灵活拓展,平台可提供视频远程监控、录像、存储与回放、视频转码、视频快照、告警、云台控制、语音对讲、平台级联等视频能力。 EasyCVR安防监控视频综合管理平台采用先进的网络传输技术࿰…...

联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)
最近使用联想电脑的小伙伴们问我,联想电脑怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术,当CPU支持VT-x虚拟化技术,有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中,手动进行设置ÿ…...

手把手教你使用YOLOv11训练自己数据集(含环境搭建 、数据集查找、模型训练)
一、前言 本文内含YOLOv11网络结构图 训练教程 推理教程 数据集获取等有关YOLOv11的内容! 官方代码地址:https://github.com/ultralytics/ultralytics/tree/main/ultralytics/cfg/models/11 二、整体网络结构图 三、环境搭建 项目环境如下…...

LabVIEW界面输入值设为默认值
在LabVIEW中,将前面板上所有控件的当前输入值设为默认值,可以通过以下步骤实现: 使用控件属性节点:你可以创建一个属性节点来获取所有控件的引用。 右键点击控件,选择“创建” > “属性节点”。 设置属性节点为“D…...

【Android 14源码分析】Activity启动流程-1
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...

Java 中 synchronized 和 Thread 的使用场合介绍
在 Java 编程中,synchronized 和 Thread 是处理并发与多线程编程的关键工具。多线程编程是为了在单一程序中并行执行多个任务,Java 提供了丰富的 API 和关键字以实现这一目标,而其中 synchronized 和 Thread 是非常基础和重要的部分。 synch…...
爬虫库是什么?是ip吗
爬虫库通常指的是用于网页爬虫(Web Scraping)开发的代码库或框架,它不是IP地址。以下是关于爬虫库的详细解释: 爬虫库的定义 爬虫库是一些用于简化网络数据抓取过程的工具和框架,通常提供了一系列函数和类࿰…...

【MySQL】查询原理 —— B+树查询数据全过程
使用B树作为索引结构的原因: 一种自平衡树: B树在插入和删除的时候节点会进行分裂和合并操作,以保持树的平衡,存在冗余节点,使得删除的时候树结构变化小,更高效。 高度不会增长过快,查询磁盘I…...

系统设置 WIFI输入框被挡住解决方案
文章目录 问题点复现的场景机器横屏可复现,竖屏不存在跟density 相关的。 解决问题方案设置输入模式路径 部分源码跟踪方法 延伸思考设置输入模式设置主题 问题点 进入系统设置-网络和互联网-WLAN-点击WIFI item ,密码输入框被遮挡,输入的密码不可见.如…...

SpringCloud无法注册Nacos和配置中心
今天升级SpringCloud版本,导致服务无法注册到nacos,使用nacos作为配置中心也无法刷新配置信息,后来发现是因为只更新了SpringCloud版本,SpringCloud-Alibaba没有更新导致的问题。 升级出现问题的版本是: <dependen…...

word2vector训练数据集整理(代码实现)
import math import os import random import torch import dltools from matplotlib import pyplot as plt #读取数据集 def read_ptb():"""将PTB数据集加载到文本行的列表中"""with open(./ptb/ptb.train.txt) as f:raw_text f.read()return…...

无心上班,只想为祖国庆生?让ChatGPT帮你搞定工作!
国庆假期临近,大家的心早已飞向诗和远方了吧。 然而,现实总是无情地将我们拉回到堆积如山的工作任务上:紧急报告的截止日期就在眼前,复杂的项目策划还未动笔,客户的定制需求迫在眉睫。每年的这个时候,如何…...

【Python】YOLO牛刀小试:快速实现视频物体检测
YOLO牛刀小试:快速实现视频物体检测 在深度学习的众多应用中,物体检测是一个热门且重要的领域。YOLO(You Only Look Once)系列模型以其快速和高效的特点,成为了物体检测的首选之一。本文将介绍如何使用YOLOv8模型进行…...

Vscode超好看的渐变主题插件
样式效果: 插件使用方法: 然后重启,之后会显示vccode损坏,不用理会,因为这个插件是更改了应用内部代码,直接不再显示即可。...

OceanBase技术解析:自适应分布式下压技术
在《OceanBase 数据库源码解析》这本书中,关于SQL执行器的深入剖析相对较少,因此,希望增添一些实用且详尽的补充内容。 上一篇博客《 OceanBase技术解析: 执行器中的自适应技术》中,已初步介绍了执行器中几项典型的自适…...
Firebase和JavaScript创建Postback Link逻辑
Firebase是一个提供后端即服务(BaaS)的平台,它允许开发者快速构建应用程序而无需管理服务器。Firebase不直接提供生成Postback Link的功能,但您可以使用Firebase的功能来构建和管理URL,然后在客户端使用这些URL来实现Postback。 以下是如何使用Firebase和JavaScript来创建…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...