首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与MySQL相比,Oracle中的功能索引

问与MySQL相比,Oracle中的功能索引
EN

Database Administration用户
提问于 2018-09-20 08:16:21
回答 1查看 629关注 0票数 1

希望您能帮助我理解我在将Oracle12c数据库转换为MySQL 5.7时面临的一个特定问题。

对于上下文,假设我们有一个表看起来有点像这样:

代码语言:javascript
复制
id    firstname    lastname
---------------------------
1     John         Jones
2     tom          smith
3     ALEX         JonEs

数据可以在任何情况下或混合情况下输入到表中,在应用程序级别上没有控制,在数据库级别上没有任何约束或触发器。

因此,为了有效查询,在Oracle中创建了一个功能索引,如下所示,因为我们将始终使用小写函数查询lastname字段:

代码语言:javascript
复制
CREATE INDEX idx_table1_lastname ON schema1.table1 (LOWERCASE(lastname))

我们不能在MySQL中这样做,因为函数索引不是一件事。MySQL中的同一列是作为排序规则utf8-general-ci创建的,所以我的问题是。

如果我们在MySQL数据库上创建相同的索引,我们只能这样做:

代码语言:javascript
复制
CREATE INDEX idx_table1_lastname ON table1 (lastname)

考虑到我们列的排序不区分大小写,索引会有效吗?或者我们应该设置一些东西来确保我们为这个字段编写的所有数据库都是在一致的情况下编写的?

谢谢

EN

回答 1

Database Administration用户

回答已采纳

发布于 2018-09-24 09:31:44

MySQL没有函数索引,但是它有生成的列(至少在5.7版本和MariaDB 5.5+中),这些列可以被索引。

有关详细信息,请参阅正式文档:生成列。

使用示例:

代码语言:javascript
复制
ALTER TABLE schema1.table1
    ADD lower_lastname VARCHAR(100) AS (LOWER(lastname)) ;

CREATE INDEX idx_table1_lastname
    ON schema1.table1 (lower_lastname) ;

和dbfiddle.uk测试,您可以看到索引是使用的。

现在,如果您不需要区分'Jack'和'jack',并且已经用不区分大小写的排序规则定义了列,则不需要使用上面的构造。您可以只对大小写不敏感的列进行索引。

如果要进行区分大小写的比较和不区分大小写的比较,以及在Oracle数据库具有功能索引的其他领域(即具有数值列或日期列),则此构造非常有用。

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/218115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档