1. 程式人生 > >MySQL隱形索引簡介

MySQL隱形索引簡介

 

不可見索引允許您將索引標記為查詢優化器不可用。MySQL維護不可見索引,並在與索引關聯的列中的資料發生更改時使其保持最新。

預設情況下,索引是可見的。要使它們不可見,您必須在建立時或使用ALTER TABLE命令顯式宣告其可見性MySQL為我們提供了維護索引可見性的關鍵字VISIBLEINVISIBLE關鍵字。

要建立不可見索引,請使用以下語句:

 
1 2 CREATE INDEX index_name
ON table_name( c1, c2, ...) INVISIBLE;

在這個語法中:

  1. 首先,在CREATE INDEX子句後指定索引的名稱
  2. 其次,列出要新增到索引的表名和列列表。INVISIBLE關鍵字表明您正在建立的索引是不可見的。

例如,以下語句在示例資料庫extension中的employees上建立索引,並將其標記為不可見索引:

 
1 2 CREATE INDEX extension ON employees(extension) INVISIBLE;

要更改現有索引的可見性,請使用以下語句:

 
1 2 ALTER TABLE table_name
ALTER INDEX index_name [VISIBLE | INVISIBLE];

例如,要使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';

這是輸出:

MySQL隱形索引示例

此外,您可以使用該SHOW INDEXES命令顯示錶的所有索引:

 
1 SHOW INDEXES FROM employees;

如前所述,查詢優化器不使用不可見索引,那麼為什麼首先使用不可見索引?實際上,隱形索引有許多應用程式。例如,您可以使索引不可見,以檢視它是否對效能產生影響,並將索引再次標記為可見。

MySQL隱形索引和主鍵

主鍵上的索引不能是不可見的。如果您嘗試這樣做,MySQL將發出錯誤。

此外,隱式主鍵索引也不可見。當您UNIQUENOT 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隱形索引,如何建立