Index

與 MySQL 相比,Oracle 中的功能索引

  • September 24, 2018

希望您能幫助我了解在將 Oracle 12c 數據庫轉換為 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)

考慮到我們列的排序規則不區分大小寫,索引是否有效?或者我們是否應該採取一些措施來確保我們對該欄位的所有數據庫寫入都以一致的情況寫入?

謝謝

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