希望您能帮助我理解我在将Oracle12c数据库转换为MySQL 5.7时面临的一个特定问题。
对于上下文,假设我们有一个表看起来有点像这样:
id firstname lastname
---------------------------
1 John Jones
2 tom smith
3 ALEX JonEs数据可以在任何情况下或混合情况下输入到表中,在应用程序级别上没有控制,在数据库级别上没有任何约束或触发器。
因此,为了有效查询,在Oracle中创建了一个功能索引,如下所示,因为我们将始终使用小写函数查询lastname字段:
CREATE INDEX idx_table1_lastname ON schema1.table1 (LOWERCASE(lastname))我们不能在MySQL中这样做,因为函数索引不是一件事。MySQL中的同一列是作为排序规则utf8-general-ci创建的,所以我的问题是。
如果我们在MySQL数据库上创建相同的索引,我们只能这样做:
CREATE INDEX idx_table1_lastname ON table1 (lastname)考虑到我们列的排序不区分大小写,索引会有效吗?或者我们应该设置一些东西来确保我们为这个字段编写的所有数据库都是在一致的情况下编写的?
谢谢
发布于 2018-09-24 09:31:44
MySQL没有函数索引,但是它有生成的列(至少在5.7版本和MariaDB 5.5+中),这些列可以被索引。
有关详细信息,请参阅正式文档:生成列。
使用示例:
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数据库具有功能索引的其他领域(即具有数值列或日期列),则此构造非常有用。
https://dba.stackexchange.com/questions/218115
复制相似问题