MySQL隱形索引簡介
不可見索引允許您將索引標記為查詢優化器不可用。MySQL維護不可見索引,並在與索引關聯的列中的資料發生更改時使其保持最新。
預設情況下,索引是可見的。要使它們不可見,您必須在建立時或使用ALTER TABLE
命令顯式宣告其可見性。MySQL為我們提供了維護索引可見性的關鍵字VISIBLE
和INVISIBLE
關鍵字。
要建立不可見索引,請使用以下語句:
1 2 |
CREATE INDEX index_name |
在這個語法中:
- 首先,在
CREATE INDEX
子句後指定索引的名稱。 - 其次,列出要新增到索引的表名和列列表。該
INVISIBLE
關鍵字表明您正在建立的索引是不可見的。
例如,以下語句在示例資料庫extension
中的employees
表的列上建立索引,並將其標記為不可見索引:
1 2 | CREATE INDEX extension ON employees(extension) INVISIBLE; |
要更改現有索引的可見性,請使用以下語句:
1 2 |
ALTER TABLE table_name |
例如,要使extension
索引可見,請使用以下語句:
1 2 | ALTER TABLE employees ALTER INDEX extension VISIBLE; |
您可以通過查詢資料庫中的statistics
表來查詢索引及其可見性information_schema
:
1 2 3 4 5 6 7 8 | SELECT index_name, is_visible FROM information_schema.statistics WHERE table_schema = 'classicmodels' AND table_name = 'employees'; |
這是輸出:
此外,您可以使用該SHOW INDEXES
命令顯示錶的所有索引:
1 | SHOW INDEXES FROM employees; |
如前所述,查詢優化器不使用不可見索引,那麼為什麼首先使用不可見索引?實際上,隱形索引有許多應用程式。例如,您可以使索引不可見,以檢視它是否對效能產生影響,並將索引再次標記為可見。
MySQL隱形索引和主鍵
主鍵列上的索引不能是不可見的。如果您嘗試這樣做,MySQL將發出錯誤。
此外,隱式主鍵索引也不可見。當您UNIQUE
在NOT NULL
沒有主鍵的表的列上定義索引時,MySQL會隱式地理解該列是主鍵列,並且不允許您使索引不可見。
請考慮以下示例。
首先,建立一個新表與UNIQUE
上一個索引NOT NULL
列:
1 2 3 4 5 6 7 8 | CREATE TABLE discounts ( discount_id INT NOT NULL, name VARCHAR(50) NOT NULL, valid_from DATE NOT NULL, valid_to DATE NOT NULL, amount DEC(5 , 2 ) NOT NULL DEFAULT 0, UNIQUE discount_id(discount_id) ); |
其次,嘗試使discount_id
索引不可見:
1 2 | ALTER TABLE discounts ALTER INDEX discount_id INVISIBLE; |
MySQL發出以下錯誤訊息:
1 | Error Code: 3522. A primary key index cannot be invisible |
MySQL隱形索引系統變數
為了控制查詢優化器使用的可見索引,MySQL使用系統變數的use_invisible_indexes
標誌optimizer_switch
。預設情況下,use_invisible_indexes
關閉:
1 | SELECT @@optimizer_switch; |
在本教程中,您瞭解了MySQL隱形索引,如何建立