使用算术运算符索引列

use*_*272 3 mysql postgresql index

我通常在我的数据库上进行这个查询 SELECT * FROM Example_tab WHERE Column_a + Column_b < 10;

是否可以创建基于Column_a + Column_b < 10加速此查找的索引。我认为可以在此处为基于 oracle 的数据库执行此操作(通过执行CREATE INDEX Idx ON Example_tab(Column_a + Column_b);)。但我无法在任何地方为 postgresql 或 mysql 找到它。

甚至可以在 oracle 以外的数据库上执行此操作吗?如果是,它是否记录在某处,它们叫什么(基本上,我应该用什么 google 找到它们)?

在此先感谢您的帮助。

ype*_*eᵀᴹ 7

PostgreSQL 有表达式索引(我认为是从第 7 版开始!),请查看文档:表达式索引

因此,您可以轻松地在 上添加索引(column_a + column_b),其语法几乎与 Oracle 中的完全相同。唯一的区别是表达式周围的额外括号:

CREATE INDEX idx 
  ON Example_tab
  ((column_a + column_b)) ;
Run Code Online (Sandbox Code Playgroud)

注意万一上述和文档是不明确的:
一个表达式可以是一样复杂人愿意,并且可以包括任何数量的运营商或函数调用。


MySQL 没有这样的索引,但它们有一个类似的概念,可以替代使用。MariaDB在其 5.2 版本中引入了VIRTUAL(计算)列,而核心 MySQL 刚刚GENERATED在最新的 5.7 中添加了它们(称为)。请参阅:在 MySQL 中生成的列

因此 - 在 MariaDB 和 MySQL 中 - 您可以添加一个计算列,然后在其上添加一个索引。语法相似,但有一些小的差异。对于MariaDB,该列可以是VIRTUALPERSISTED。如果你想索引它,它必须是PERSISTED

ALTER TABLE Example_tab
   ADD COLUMN a_plus_b AS 
       (column_a + column_b) PERSISTED,
   ADD INDEX idx
       (a_plus_b) ;
Run Code Online (Sandbox Code Playgroud)

对于MySQL,该列可以定义为VIRTUALSTORED。如果你希望它被索引,对于 5.7.8 之前的版本,它必须是STORED. 对于 5.7.8+ 版本,可以存储也可以不存储(在这种情况下,计算值仅存储一次,在索引中)。查看有关虚拟列索引的详细信息:

ALTER TABLE Example_tab
   ADD COLUMN a_plus_b AS 
       (column_a + column_b),     -- optionally: STORED,
   ADD INDEX idx
       (a_plus_b) ;
Run Code Online (Sandbox Code Playgroud)