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

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

聚集索引(Clustered Index)

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

特点
  1. 物理排序:数据行按照索引键的顺序物理存储。
  2. 唯一性:每个表只能有一个聚集索引。
  3. 性能:对于范围查询和排序操作,聚集索引性能较高。
创建聚集索引的示例
sql 复制代码
-- 创建一个表
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. 性能:对于精确查找和特定列的查询,非聚集索引性能较高。
创建非聚集索引的示例
sql 复制代码
-- 创建一个表
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列上创建了非聚集索引。尽管数据行的物理顺序不变,但索引加速了基于这些列的查询。

查询索引信息

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

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

示例

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

sql 复制代码
-- 创建表
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');

总结

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

相关推荐
笨蛋不要掉眼泪几秒前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_15 分钟前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
fen_fen9 小时前
Oracle建表语句示例
数据库·oracle
砚边数影10 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库
orange_tt11 小时前
Djiango配置Celery
数据库·sqlite
云小逸11 小时前
【nmap源码学习】 Nmap网络扫描工具深度解析:从基础参数到核心扫描逻辑
网络·数据库·学习
肉包_51111 小时前
两个数据库互锁,用全局变量互锁会偶发软件卡死
开发语言·数据库·c++
霖霖总总12 小时前
[小技巧64]深入解析 MySQL InnoDB 的 Checkpoint 机制:原理、类型与调优
数据库·mysql
此刻你13 小时前
常用的 SQL 语句
数据库·sql·oracle
それども13 小时前
分库分表的事务问题 - 怎么实现事务
java·数据库·mysql