跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

KingbaseES 索引与视图创建管理指南

KingbaseES 数据库通过索引加速查询,通过视图简化逻辑与控制权限。 ksql 命令行操作,涵盖索引类型选择、创建唯一及复合索引、查看与维护(重建/重命名/删除)、视图定义与只读设置、常见问题排查等实操步骤,帮助优化查询性能并保障数据安全。

云间漫步发布于 2026/3/15更新于 2026/10/26114 浏览
KingbaseES 索引与视图创建管理指南

KingbaseES 索引与视图创建管理指南

引言

掌握表的基本运作之后,若想优化查询效率并简化数据访问,就要去学习'索引'和'视图'的运用。索引类似于'书籍目录',可以极大地加快查询速度;视图类似'数据窗口',能够隐藏复杂的查询逻辑,还能控制数据的可见性。本文就 ksql 命令行操作索引与视图展开论述,把从作用到创建,再到查看、维持直至删除的全过程拆解成实际操作步骤,并结合例子和避坑提示。

一、前置准备:确认操作基础

索引和视图要依托已有的表,所以得先做好如下预备工作,以防止在操作过程中因为依赖缺失而出现错误提示。

1.1 连接数据库并切换目标模式

利用 ksql 建立与本地 KingbaseES 数据库的联系,转到先前所创建的 test_schema 模式当中,检查目标表是否确实存在(拿 sys_user 表来说,要是没有就再次创建它),这样做的目的是确保后续操作能够顺利执行。

-- 1. 连接数据库(若未连接)
ksql -d kingbase -U system

-- 2. 切换到 test_schema 模式
SET search_path TO test_schema, public;

-- 3. 确认目标表存在(如 sys_user 表)
\dt sys_user;

-- 若不存在,创建示例表(用于后续索引/视图操作)
CREATE TABLE IF NOT EXISTS sys_user (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    phone CHAR(11) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) TABLESPACE test_ts;

执行后若显示 Table "test_schema.sys_user" does not exist,则先执行上述 CREATE TABLE 语句创建表,确保后续操作有载体。

1.2 插入测试数据

为了后续可以检测索引的查询速度,并查看视图的数据展示情况,要给 sys_user 表增添大量模拟数据来做测试。

-- 批量插入 10 条测试数据
INSERT INTO test_schema.sys_user (name, phone, email)
 (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , ),
       (, , );
VALUES
'张三'
'13800138000'
'[email protected]'
'李四'
'13900139000'
'[email protected]'
'王五'
'13700137000'
'[email protected]'
'赵六'
'13600136000'
'[email protected]'
'孙七'
'13500135000'
'[email protected]'
'周八'
'13400134000'
'[email protected]'
'吴九'
'13300133000'
'[email protected]'
'郑十'
'13200132000'
'[email protected]'
'钱一'
'13100131000'
'[email protected]'
'冯二'
'1300130000'
'[email protected]'

执行后提示 INSERT 0 10,表示数据插入成功,为后续操作提供测试基础。

二、索引管理:给表'加目录',加速查询

索引是 KingbaseES 优化查询性能的核心手段 —— 当表数据量较大时(如 10 万条 +),无索引的查询会'全表扫描'(逐行查找),而有索引的查询会通过'索引目录'直接定位数据,速度提升成百上千倍。接下来我们按'创建→查看→维护→删除'展开讲解。

2.1 索引的类型与适用场景

新手需先明确不同索引的作用,避免盲目创建(索引并非越多越好,会增加更新/插入的开销)。

2.2 创建索引:用 CREATE INDEX 语句

2.2.1 示例 1:创建普通索引

给 sys_user 表的 phone 列建普通索引(频繁按手机号查用户时用):

-- 语法:CREATE INDEX 索引名 ON 表名 (字段名);
CREATE INDEX idx_sys_user_phone ON test_schema.sys_user(phone);
  • 索引名规范:提议采用'idx_表名_字段名'格式,这样便于识别,比如'idx_sys_user_phone'就表示'sys_user'表中'phone'列的索引。

成功验证:执行后提示 CREATE INDEX,表示索引创建成功。

2.2.2 示例 2:创建唯一索引

给 sys_user 表的 email 列建唯一索引(既确保邮箱不重复,又加速邮箱查询):

-- 语法:CREATE UNIQUE INDEX 索引名 ON 表名 (字段名);
CREATE UNIQUE INDEX idx_sys_user_email ON test_schema.sys_user(email);

与 UNIQUE 约束的区别:唯一索引只保证值唯一,UNIQUE 约束包含约束和唯一索引,如果表已有 email 的 UNIQUE 约束,则不必再创建 email 的唯一索引,因为约束本身就会生成索引。

2.2.3 示例 3:创建复合索引

为 sys_user 表的 name 和 create_time 列创建复合索引,当经常依照'姓名 + 创建时间范围'执行查询的时候会用到这个索引。

-- 语法:CREATE INDEX 索引名 ON 表名 (字段 1, 字段 2);
CREATE INDEX idx_sys_user_name_createtime ON test_schema.sys_user(name, create_time);

字段顺序注意:复合索引依照'最左符合原则',索引 (name, create_time) 可加强 name 单字段查询,也可加强 name + create_time 综合查询,但无法加强 create_time 单字段查询,要按照查询习惯来确定字段顺序。

2.3 查看索引:确认索引存在与关联表

创建索引后,需通过 ksql 命令查看索引列表、关联表及详情,推荐 \di 和 \d+ 命令。

2.3.1 示例 1:查看所有索引

执行 \di 可列出当前模式下的所有索引,确认索引是否创建成功:

\di

关键信息解读:

  • Table:索引关联的表(确认是 sys_user);
  • Columns:索引对应的字段(单字段/多字段);

sys_user_pkey:主键自动创建的索引(无需手动创建)。

2.3.2 示例 2:查看表关联的索引

若需查看某张表的所有索引(如 sys_user),执行 \d+ 表名:

\d+ test_schema.sys_user

直接展示表关联的所有索引,包括类型(PRIMARY KEY/UNIQUE/普通)和字段,清晰直观。

2.4 索引维护:优化性能与调整结构

索引经过一定时间的使用之后,有可能会出现由于数据频繁被删除或者更新而造成的'碎片化'现象,即索引文件中存在许多空白空间,这种情况下要借助重建索引来改善这种情况,而且按照个人需求也可以重新命名或者直接删除索引。

2.4.1 示例 1:重建索引

当索引查询速度变慢时,重建索引可整理碎片,恢复性能(表大时建议离线执行,避免影响业务):

-- 语法:REINDEX INDEX 索引名;
REINDEX INDEX idx_sys_user_phone;

-- 进阶:重建表的所有索引(更高效)
REINDEX TABLE sys_user;
  • 成功验证:执行后提示 REINDEX,表示重建完成。
2.4.2 示例 2:重命名索引

索引名若不符合规范,可以重新命名,可以把 idx_sys_user_phone 改为 idx_sys_user_mobile。

-- 语法:ALTER INDEX 旧索引名 RENAME TO 新索引名;
ALTER INDEX idx_sys_user_phone RENAME TO idx_sys_user_mobile;

验证:执行 \d+ test_schema.sys_user 可看到索引名已更新。

2.4.3 示例 3:删除索引

某字段查询频率降低或者索引致使插入/更新变慢的时候,要删除无用索引(要注意的是,主键索引以及与唯一约束相关联的索引不能直接删,应当先删约束)。

-- 语法:DROP INDEX IF EXISTS 索引名;
DROP INDEX IF EXISTS idx_sys_user_name_createtime;
  • IF EXISTS:避免索引不存在时报错,仅提示警告;
  • 验证:执行 \d+ test_schema.sys_user 确认索引已移除。

2.5 索引使用注意事项

  1. 索引并非越多越好:索引会加重插入、更新和删除时的开销,因为每当数据发生变动的时候,都要同步更新索引。所以一张表的索引最好别超过 5 个。
  2. 小表不需要创建索引:当数据量小于 1 万条时,全表扫描比索引查询速度更快,因为索引查询要先查找索引再查找数据,这就多了一次 IO 操作。
  3. 列如果经常更新就不要创建索引:比如'订单状态'这个字段(其值每秒都在变),给它创建索引之后,索引就会频繁地执行同步操作,从而影响到整体的性能表现。
  4. 要避开对函数执行索引字段:像 WHERE SUBSTR(phone, 1, 3) = '138' 这种情况会使索引失效,应该改成 WHERE phone LIKE '138%'(前缀符合能够利用索引)。

三、视图管理:给数据'开窗口',简化查询与控制权限

视图属于'虚拟表',它依靠 SQL 查询结果生成,并未储存实际数据(数据仍旧保存在原始表当中),其关键意义在于'隐匿复杂查询逻辑'以及'调控数据可见范围'(譬如仅仅向用户显示某些列),我们按照'创建 - 查看 - 操作 - 删除'的顺序来执行。

3.1 视图的核心作用

新手容易混淆'表'和'视图',用通俗比喻理解:

  • 表:'仓库',存储实际数据;
  • 视图名为'仓库窗口',此视图仅显示指定区域的货物(数据),无法看到整个仓库的概貌,而且该窗口不可直接被修改,要经过此窗口去更改仓库的数据,不过存在一些限制。

视图的核心场景:

  1. 简化复杂查询:多表关联查询(JOIN)可以被封装成视图,之后的查询直接针对该视图展开,不必再次书写复杂的 SQL 语句。
  2. 数据权限控制方面:可以向普通用户展示 sys_user 表中 name 和 phone 字段的内容,而将 email 这类敏感信息遮盖起来,这要依靠视图来达成。
  3. 数据一致性:多系统共用同一查询逻辑时,视图可确保所有系统使用相同的筛选条件。

3.2 创建视图:用 CREATE VIEW 语句

3.2.1 示例 1:基础视图

创建'用户基础信息视图 vw_sys_user_basic',只包含 id、name、phone 列(隐藏 email 敏感信息):

-- 语法:CREATE VIEW 视图名 AS SELECT 语句;
CREATE VIEW vw_sys_user_basic AS
SELECT id, name, phone FROM test_schema.sys_user;

成功验证:执行后提示 CREATE VIEW,表示视图创建成功。

3.2.2 示例 2:进阶视图

创建'2024 年创建的用户视图 vw_sys_user_2024',筛选 create_time 在 2024 年的用户,包含 name、email、create_time 列:

CREATE VIEW vw_sys_user_2024 AS
SELECT name, email, create_time 
FROM test_schema.sys_user 
WHERE create_time >= '2024-01-01 00:00:00' AND create_time < '2025-01-01 00:00:00';
  • 动态性:视图数据会随原表变化自动更新(如原表新增 2024 年用户,视图会自动包含该数据)。
3.2.3 示例 3:只读视图

若需确保视图数据不被修改(如报表视图),可添加 WITH READ ONLY 选项:

CREATE VIEW vw_sys_user_report AS
SELECT name, phone, create_time FROM test_schema.sys_user WITH READ ONLY;
  • 效果:后续若尝试通过视图修改数据(如 UPDATE vw_sys_user_report SET name='张三'),会报错'cannot update a read-only view'。

3.3 查看视图:确认视图定义与关联表

创建视图之后,要利用 ksql 命令来查看视图列表,定义以及相关联的表,建议使用 \dv 和 \d+ 这两个命令。

3.3.1 示例 1:查看所有视图

执行 \dv 可列出当前模式下的所有视图,确认视图是否创建成功。

3.3.2 示例 2:查看视图定义

若需确认视图的底层 SQL(如忘记视图筛选条件),执行 \d+ 视图名:

\d+ vw_sys_user_2024

直接展示视图的完整 SQL 定义,便于后续修改或验证逻辑。

3.4 视图操作:查询、修改与删除

视图的核心操作是'查询',修改和删除需遵循特定规则。

3.4.1 示例 1:查询视图数据

查询视图数据的语法和查询表完全相同,无需额外学习:

-- 查询基础视图数据
SELECT * FROM vw_sys_user_basic;

-- 查询 2024 年用户视图,按创建时间排序
SELECT * FROM vw_sys_user_2024 ORDER BY create_time DESC;
  • 效果:返回结果与查询原表筛选后的数据一致,但看不到隐藏的列(如 email 在 vw_sys_user_basic 中不可见)。
3.4.2 示例 2:修改视图定义

若需调整视图的筛选条件或列(如 vw_sys_user_2024 改为包含 2023 年数据),无需删除视图,直接用 CREATE OR REPLACE 修改:

CREATE OR REPLACE VIEW vw_sys_user_2024 AS
SELECT name, email, create_time 
FROM test_schema.sys_user 
WHERE create_time >= '2023-01-01 00:00:00' AND create_time < '2025-01-01 00:00:00';
  • 验证:执行 \d+ vw_sys_user_2024 确认定义已更新。
3.4.3 示例 3:删除视图

当视图不再使用时,执行删除命令(删除视图不影响原表数据,仅删除视图定义):

-- 语法:DROP VIEW IF EXISTS 视图名;
DROP VIEW IF EXISTS vw_sys_user_report;
  • 验证:执行 \dv 确认视图已移除。

3.5 视图使用注意事项

  1. 视图修改限制:含以下情况的视图无法修改数据(即使未加 READ ONLY):
    • 视图涵盖 DISTINCT(去重),GROUP BY(分组),HAVING(筛选分组)。
    • 视图包含聚合函数(如 COUNT、SUM);
    • 视图来自多表关联(JOIN);
  2. 原表删除影响:若原表(比如 sys_user 表)被删除,则该视图就会成为'无效视图',在执行查询的时候,会收到'relation does not exist'的错误提示。
  3. 性能注意:复杂视图包含多表关联或者聚合情况时,其查询效率依靠原表索引,所以要保证原表中相关联的字段已有索引,比如在多表 JOIN 操作里涉及的关联列就需要事先创建好索引。

四、常见问题排查:索引与视图的高频报错

问题 1:创建索引报错'重复的键名'

报错信息:

ERROR: duplicate key name "idx_sys_user_phone"

原因:同名索引已存在(如之前已创建 idx_sys_user_phone)。 解决方案:

  • 执行 \di 查看索引名,确认是否重复;
  • 若需重新建索引,先删除旧索引(DROP INDEX idx_sys_user_phone;),再创建新索引。

问题 2:查询视图报错'关系对象不存在'

报错信息:

ERROR: relation "vw_sys_user_basic" does not exist

原因:

  1. 视图名拼写错误(如 vw_sys_user_basci);
  2. 视图所在模式不在搜索路径中(如视图在 test_schema,但当前搜索路径是 public)。 解决方案:
  • 检查视图名拼写(执行 \dv 确认正确名称);
  • 切换到视图所在模式(SET search_path TO test_schema, public;),或用'模式名。视图名'全称查询(SELECT * FROM test_schema.vw_sys_user_basic;)。

问题 3:通过视图修改数据报错'无法更新只读视图'

报错信息:

ERROR: cannot update a read-only view "vw_sys_user_report"

原因:视图创建时加了 WITH READ ONLY 选项,禁止修改。 解决方案:

  • 注意:重新创建前需确认视图无修改限制(如不含 GROUP BY、聚合函数等)。

若需允许修改,重新创建视图(去掉 WITH READ ONLY):

CREATE OR REPLACE VIEW vw_sys_user_report AS
SELECT name, phone, create_time FROM sys_user;

五、总结:索引与视图的配合使用

本文完整覆盖了索引和视图的核心操作,核心要点可总结为:

  1. 管理'查询速度':依照查询场景来挑选普通/唯一/复合索引,不要过度创建,要定时执行重建并改善性能。
  2. 视图:管'查询简化与权限',封装复杂逻辑、隐藏敏感数据,注意修改限制和原表依赖;
  3. 配合使用:视图的查询速度与原表索引相关,给 vw_sys_user_2024 视图对应的 sys_user 原表创建 create_time 索引之后,其查询效率会得到很大的改善。

掌握了索引和视图之后,你就具有了 KingbaseES 高效查询的关键能力。

目录

  1. KingbaseES 索引与视图创建管理指南
  2. 引言
  3. 一、前置准备:确认操作基础
  4. 1.1 连接数据库并切换目标模式
  5. 1.2 插入测试数据
  6. 二、索引管理:给表“加目录”,加速查询
  7. 2.1 索引的类型与适用场景
  8. 2.2 创建索引:用 CREATE INDEX 语句
  9. 2.2.1 示例 1:创建普通索引
  10. 2.2.2 示例 2:创建唯一索引
  11. 2.2.3 示例 3:创建复合索引
  12. 2.3 查看索引:确认索引存在与关联表
  13. 2.3.1 示例 1:查看所有索引
  14. 2.3.2 示例 2:查看表关联的索引
  15. 2.4 索引维护:优化性能与调整结构
  16. 2.4.1 示例 1:重建索引
  17. 2.4.2 示例 2:重命名索引
  18. 2.4.3 示例 3:删除索引
  19. 2.5 索引使用注意事项
  20. 三、视图管理:给数据“开窗口”,简化查询与控制权限
  21. 3.1 视图的核心作用
  22. 3.2 创建视图:用 CREATE VIEW 语句
  23. 3.2.1 示例 1:基础视图
  24. 3.2.2 示例 2:进阶视图
  25. 3.2.3 示例 3:只读视图
  26. 3.3 查看视图:确认视图定义与关联表
  27. 3.3.1 示例 1:查看所有视图
  28. 3.3.2 示例 2:查看视图定义
  29. 3.4 视图操作:查询、修改与删除
  30. 3.4.1 示例 1:查询视图数据
  31. 3.4.2 示例 2:修改视图定义
  32. 3.4.3 示例 3:删除视图
  33. 3.5 视图使用注意事项
  34. 四、常见问题排查:索引与视图的高频报错
  35. 问题 1:创建索引报错“重复的键名”
  36. 问题 2:查询视图报错“关系对象不存在”
  37. 问题 3:通过视图修改数据报错“无法更新只读视图”
  38. 五、总结:索引与视图的配合使用

更多推荐文章

查看全部
  • DeepSeek-R1 本地部署指南与语音功能实现
  • GitHub 全界面中文化插件安装与配置指南
  • 相干伊辛机在医疗及医疗 AI 领域的应用前景
  • 手搓简易 Linux 进程池:基于管道的任务分发系统实现
  • OpenClaw AI 编程上下文 Token 限制分析与扩容实战
  • Python 集合与列表性能对比:何时更快?
  • 实测 6 款国产大模型实用性:长文本与多模态能力横向对比
  • 硬件电源设计:VR 多相电源架构与选型实战
  • 基于 RocketMQ 实现分布式事务最终一致性
  • TortoiseGit 安装与基本操作指南
  • Python 爬虫实战:批量获取股票实时行情数据
  • BeyondMimic 人形机器人舞蹈训练与 rl_sar 部署实践
  • Dify 开源 LLM 应用开发平台:从安装到实战指南
  • 网络安全系统学习路线规划:从基础到进阶实战指南
  • PyTorch 实战:加载模型权重与 ONNX 推理部署
  • 笔记本 CPU 环境下 Faster-Whisper 模型模式选择指南
  • AI 大模型学习路线:从理论到实践全面提升核心竞争力
  • 大模型 NLP 开发:行业趋势、核心技能与学习路径
  • Spring Boot 接入淘宝猫超卡 TopAPI 经验记录
  • Stable Diffusion 图生图功能入门详解

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online