当前位置: 首页 > news >正文

Oracle(21)什么是聚集索引和非聚集索引?

在数据库管理系统中,索引是一种用于加速数据检索的结构。主要有两种类型的索引:聚集索引(Clustered Index)和非聚集索引(Non-Clustered Index)。它们在数据存储和检索方面有不同的实现和用途。

聚集索引(Clustered Index)

聚集索引决定了表中数据的物理存储顺序。一个表只能有一个聚集索引,因为数据行只能有一种物理排序方式。聚集索引通常用于主键,因为它能提高查询性能。

特点
  1. 物理排序:数据行按照索引键的顺序物理存储。
  2. 唯一性:每个表只能有一个聚集索引。
  3. 性能:对于范围查询和排序操作,聚集索引性能较高。
创建聚集索引的示例
-- 创建一个表
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department VARCHAR(50)
);-- 创建聚集索引
CREATE CLUSTERED INDEX idx_employee_id
ON employees(employee_id);

在这个示例中,employee_id是主键,并且是聚集索引的一部分。数据行将按照employee_id进行物理排序。

非聚集索引(Non-Clustered Index)

非聚集索引不改变表中数据的物理存储顺序。它创建一个单独的结构(通常是B-tree),该结构包含索引键和指向数据行的指针。一个表可以有多个非聚集索引。

特点
  1. 逻辑排序:数据行的物理存储顺序不变,但索引键在索引结构中排序。
  2. 多个索引:每个表可以有多个非聚集索引。
  3. 性能:对于精确查找和特定列的查询,非聚集索引性能较高。
创建非聚集索引的示例
-- 创建一个表
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department VARCHAR(50)
);-- 创建非聚集索引
CREATE NONCLUSTERED INDEX idx_last_name
ON employees(last_name);-- 创建另一个非聚集索引
CREATE NONCLUSTERED INDEX idx_department
ON employees(department);

在这个示例中,last_namedepartment列上创建了非聚集索引。尽管数据行的物理顺序不变,但索引加速了基于这些列的查询。

查询索引信息

可以通过系统视图查询索引的相关信息:

-- 查询所有索引
SELECT name AS index_name,type_desc AS index_type,is_unique,is_primary_key
FROM sys.indexes
WHERE object_id = OBJECT_ID('employees');

示例

以下是一个完整的示例,展示了如何创建、使用和查询聚集索引和非聚集索引:

-- 创建表
CREATE TABLE employees (employee_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department VARCHAR(50)
);-- 创建聚集索引
CREATE CLUSTERED INDEX idx_employee_id
ON employees(employee_id);-- 创建非聚集索引
CREATE NONCLUSTERED INDEX idx_last_name
ON employees(last_name);-- 插入数据
INSERT INTO employees (employee_id, first_name, last_name, department)
VALUES (1, 'Alice', 'Smith', 'HR'),(2, 'Bob', 'Johnson', 'IT'),(3, 'Charlie', 'Brown', 'Finance');-- 查询表数据
SELECT * FROM employees;-- 查询索引信息
SELECT name AS index_name,type_desc AS index_type,is_unique,is_primary_key
FROM sys.indexes
WHERE object_id = OBJECT_ID('employees');

总结

聚集索引和非聚集索引是提高数据库查询性能的重要工具。聚集索引决定了表中数据的物理存储顺序,适用于主键和范围查询;非聚集索引则创建一个单独的结构,用于加速特定列的查询。理解和正确使用这两种索引类型,对于优化数据库性能至关重要。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SpringBoot整合SSE技术详解
  • 【环境变量】安装了一个软件,如何配置环境变量?
  • 代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙
  • 实现图片懒加载
  • 使用Cce Cash混币器进行安全的ETH-USDT跨链兑换
  • 【办公软件】Office 2019以上版本PPT 做平滑切换
  • pytest的安装和介绍和 Exit Code 含义
  • IOS-05 Swift循环控制语句
  • 修复SteamUI.dll加载失败的指南,快速修复failed to load steamui.dll
  • 【Android】Fragment的添加
  • 【Golang 面试 - 基础题】每日 5 题(五)
  • opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习
  • 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
  • Python 消费Kafka手动提交 批量存入Elasticsearch
  • 微信小程序-使用Component方法代替Page方法构造页面
  • 【译】JS基础算法脚本:字符串结尾
  • 0x05 Python数据分析,Anaconda八斩刀
  • export和import的用法总结
  • HTTP请求重发
  • Laravel核心解读--Facades
  • Sass 快速入门教程
  • springboot_database项目介绍
  • STAR法则
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue.js源码(2):初探List Rendering
  • 分布式事物理论与实践
  • 工作手记之html2canvas使用概述
  • 开源地图数据可视化库——mapnik
  • 七牛云假注销小指南
  • 前嗅ForeSpider教程:创建模板
  • 深度学习入门:10门免费线上课程推荐
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 协程
  • 你对linux中grep命令知道多少?
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (6)设计一个TimeMap
  • (C#)获取字符编码的类
  • (C)一些题4
  • (备忘)Java Map 遍历
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (含笔试题)深度解析数据在内存中的存储
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET微信公众号开发-2.0创建自定义菜单
  • /etc/skel 目录作用
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Value读取properties中文乱码解决方案
  • [ C++ ] STL---string类的模拟实现
  • [2021 蓝帽杯] One Pointer PHP
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [Apio2012]dispatching 左偏树