如何在 SQL 中为选择查询创建索引?

Posted

技术标签:

【中文标题】如何在 SQL 中为选择查询创建索引?【英文标题】:How to create index for select query in SQL? 【发布时间】:2022-01-17 13:14:19 【问题描述】:

我有一个查询如下,需要为XYZ字段创建索引,能否在select语句中创建索引:

SELECT ABC,
CASE
WHEN B IS NULL AND C IS NOT NULL THEN CONCAT(C,'/',D)
WHEN B IS NOT NULL AND C IS NULL THEN CONCAT(B,'/',D)
WHEN C IS NOT NULL AND C IS NOT NULL THEN CONCAT(B,'/',C,'/',D)
ELSE -1
END AS XYZ,
FROM TABLE_NAME
WHERE ABC=123

由于这个 XYZ 字段在“from table”中不可用,我们无法像往常一样在 create table 中创建索引。 请帮忙。

谢谢

【问题讨论】:

查询结果上的索引有什么用?这是另一个查询的一部分吗? 通过(ABC)(ABC, B, C, D) 创建索引。 由于这个XYZ字段在'from table'中不可用,我们无法像往常一样在create table中创建索引。你不需要这样的索引。或者您可以使用显示的表达式添加生成的列并对其进行索引。 .. WHEN C IS NOT NULL AND C IS NOT NULL ..列两次查是什么原因? 你的CASE可以用简单的CONCAT_WS('/', B, C, D)代替。 【参考方案1】:

您可以更改表定义以包含XYZ 作为生成的计算列。然后,在该计算列上添加一个索引。

ALTER TABLE TABLE_NAME ADD COLUMN XYZ VARCHAR(50) GENERATED ALWAYS AS
CASE
    WHEN B IS NULL AND C IS NOT NULL THEN CONCAT(C, '/', D)
    WHEN B IS NOT NULL AND C IS NULL THEN CONCAT(B, '/', D)
    WHEN C IS NOT NULL AND C IS NOT NULL THEN CONCAT(B, '/', C, '/', D)
    ELSE '-1' END
STORED;

CREATE INDEX idx_xyz ON TABLE_NAME (XYZ);

【讨论】:

我怀疑该索引是否有助于查询。【参考方案2】:

通常,首先查看WHERE 子句以确定INDEX。在这种情况下,INDEX(ABC) 很有可能会有所帮助。

【讨论】:

以上是关于如何在 SQL 中为选择查询创建索引?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?

SQL Server查询优化和事务处理

Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?

如果我在 sql server 中为表创建索引,看起来索引表的视图会受到影响吗?

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

SQL CREATE INDEX 语句:如何创建索引?