【问题标题】:How to create index for select query in SQL?如何在 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)代替。

标签: mysql select indexing


【解决方案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) 很有可能会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    相关资源
    最近更新 更多