高级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来创建…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
【记录坑点问题】IDEA运行:maven-resources-production:XX: OOM: Java heap space
问题:IDEA出现maven-resources-production:operation-service: java.lang.OutOfMemoryError: Java heap space 解决方案:将编译的堆内存增加一点 位置:设置setting-》构建菜单build-》编译器Complier...
Spring Boot SQL数据库功能详解
Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖(如org.postgresql:postgresql)后,应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息: 数据库URL格…...
