MySQL8.0新特性——不可見索引(Invisible Indexes)

      網友投稿 1292 2025-04-03

      Mysql8.0新特性——不可見索引(Invisible Indexes)


      Mysql8.0開始支持看不見的索引。一個看不見的索引根本不被優化器使用,但是通常是保持正常的。默認情況下索引是可見的。不可見的索引使測試在查詢性能上刪除索引的效果成為可能,而不需要在需要索引的情況下進行破壞性的更改。

      注意:

      該特性適用于除主鍵以外的索引(顯式或隱式)默認情況下索引是可見的!。

      將index設置為invisible,會導致優化器在選擇執行計劃時,自動忽略該索引,即便使用了FORCE INDEX

      官方文檔:

      https://dev.mysql.com/doc/refman/8.0/en/invisible-indexes.html

      1、創建測試表t1,并創建3個不可見索引

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      mysql>?CREATE?TABLE?t1?(i?INT,j?INT,k?INT,?INDEX?i_idx?(i)?INVISIBLE)?ENGINE?=?InnoDB;

      mysql>?CREATE?INDEX?j_idx?ON?t1?(j)?INVISIBLE;???--創建不可見索引:j_idx

      mysql>?ALTER?TABLE?t1?ADD?INDEX?k_idx?(k)?INVISIBLE;??--創建不可見索引:k_idx

      mysql>?SELECT?INDEX_NAME,?IS_VISIBLE???FROM?INFORMATION_SCHEMA.STATISTICS???WHERE?TABLE_SCHEMA?=?'test'?AND?TABLE_NAME?=?'t1';???--可以看到3個索引都是不可見狀態

      +------------+------------+

      |?INDEX_NAME?|?IS_VISIBLE?|

      +------------+------------+

      |?i_idx??????|?NO?????????|

      |?j_idx??????|?NO?????????|

      |?k_idx??????|?NO?????????|

      +------------+------------+

      3?rows?in?set?(0.00?sec)

      2、修改索引為可見狀態,也就是可使用的狀態

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      mysql>?ALTER?TABLE?t1?ALTER?INDEX?i_idx?VISIBLE;???--修改索引為可見狀態

      mysql>?SELECT?INDEX_NAME,?IS_VISIBLE???FROM?INFORMATION_SCHEMA.STATISTICS???WHERE?TABLE_SCHEMA?=?'test'?AND?TABLE_NAME?=?'t1';??--可以看到狀態為yes了。

      +------------+------------+

      |?INDEX_NAME?|?IS_VISIBLE?|

      MySQL8.0新特性——不可見索引(Invisible Indexes)

      +------------+------------+

      |?i_idx??????|?YES????????|

      |?j_idx??????|?NO?????????|

      |?k_idx??????|?NO?????????|

      +------------+------------+

      3?rows?in?set?(0.00?sec)

      注意:

      主鍵索引是不能被設為不可見索引的!!!!!

      一個沒有顯式主鍵的表可能仍然有一個有效的隱式主鍵,如果它在非空列上有任何惟一的索引。在這種情況下,第一個這樣的索引將同樣的約束放在表中行上,作為一個顯式的主鍵,而該索引不能被忽略。如下:

      3、創建測試表:t2,并設置唯一索引:j_idx(這個表沒有明確主鍵,但是在NOT NULL列j上的索引在行上放置了相同的約束,可以作為主鍵)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      mysql>?CREATE?TABLE?t2?(i?INT?NOT?NULL,j?INT?NOT?NULL,UNIQUE?j_idx?(j))?ENGINE?=?InnoDB;

      Query?OK,?0?rows?affected?(0.12?sec)

      mysql>?SELECT?INDEX_NAME,?IS_VISIBLE???FROM?INFORMATION_SCHEMA.STATISTICS???WHERE?TABLE_SCHEMA?=?'test'?AND?TABLE_NAME?=?'t2';

      +------------+------------+

      |?INDEX_NAME?|?IS_VISIBLE?|

      +------------+------------+

      |?j_idx??????|?YES????????|

      +------------+------------+

      1?row?in?set?(0.00?sec)

      3.1、將索引設置為不可見索引:會發現報錯

      mysql> ALTER TABLE t2 ALTER INDEX j_idx INVISIBLE;

      ERROR 3522 (HY000): A primary key index cannot be invisible

      (報錯是因為:雖然這個表沒有明確的主鍵,但是在NOT NULL列j上的索引在行上放置了相同的約束,作為主鍵,不能被忽略:)

      3.2、增加一個主鍵,如下:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      mysql>?ALTER?TABLE?t2?ADD?PRIMARY?KEY?(i);???--增加一個主鍵

      mysql>?SELECT?INDEX_NAME,?IS_VISIBLE???FROM?INFORMATION_SCHEMA.STATISTICS???WHERE?TABLE_SCHEMA?=?'test'?AND?TABLE_NAME?=?'t2';???--可以查看到有一個主鍵索引

      +------------+------------+

      |?INDEX_NAME?|?IS_VISIBLE?|

      +------------+------------+

      |?j_idx??????|?YES????????|

      |?PRIMARY????|?YES????????|

      +------------+------------+

      2?rows?in?set?(0.00?sec)

      3.3、這時候,將j_idx索引設置為不可見狀態是可以的,如:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      mysql>?ALTER?TABLE?t2?ALTER?INDEX?j_idx?INVISIBLE;

      mysql>?SELECT?INDEX_NAME,?IS_VISIBLE???FROM?INFORMATION_SCHEMA.STATISTICS???WHERE?TABLE_SCHEMA?=?'test'?AND?TABLE_NAME?=?'t2';

      +------------+------------+

      |?INDEX_NAME?|?IS_VISIBLE?|

      +------------+------------+

      |?j_idx??????|?NO?????????|

      |?PRIMARY????|?YES????????|

      +------------+------------+

      2?rows?in?set?(0.00?sec)

      從上面可以看出,已經存了顯示的主機,而j_idx唯一索引不再充當隱式主鍵,因此可以將其設置為不可見狀態。

      4、日常操作:

      --創建表指定索引為不可見狀態:

      create table t1(id int primary key,name varchar(10),index idx_name (name) invisible);

      --修改索引為可見狀態:

      alter table t1 alter index idx_name visible;

      --修改索引為不可見狀態:

      alter table t1 alter index idx_name invisible;

      --查看數據庫中有哪些不可見索引:

      mysql> select table_schema,table_name,index_name,column_name,is_visible from information_schema.statistics where is_visible='no';

      MySQL

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:我的設置里的分享打不開(為什么軟件要分享我分享不了)
      下一篇:linux 系統命令管理
      相關文章
      亚洲国产精品综合久久一线| 亚洲丁香色婷婷综合欲色啪| 亚洲AV中文无码乱人伦下载| 亚洲第一区在线观看| 亚洲色大成网站www| 久久精品国产亚洲AV忘忧草18 | 亚洲国产成人久久精品动漫| 国产偷v国产偷v亚洲高清| 亚洲色欲久久久综合网东京热| 中文字幕亚洲一区| 亚洲中文字幕无码久久2017| 亚洲免费一区二区| 永久亚洲成a人片777777| 国产亚洲一区二区精品| 亚洲爆乳精品无码一区二区三区| 亚洲成av人片天堂网| 亚洲av之男人的天堂网站| 亚洲AV无码乱码在线观看裸奔| 亚洲AV无码精品色午夜果冻不卡 | 亚洲成年网站在线观看| 亚洲中文字幕一二三四区| 亚洲精品无码国产片| 亚洲欧美综合精品成人导航| 亚洲AV无码AV日韩AV网站| 国产亚洲女在线线精品| 亚洲精品天堂成人片?V在线播放| 国产L精品国产亚洲区久久| 久久精品国产精品亚洲| 亚洲人色婷婷成人网站在线观看 | 亚洲一区二区久久| 亚洲中文字幕无码亚洲成A人片| 亚洲国产精品成人综合色在线| 色噜噜的亚洲男人的天堂| 亚洲欧洲精品成人久久曰影片| 国产精品亚洲高清一区二区| 亚洲美女又黄又爽在线观看| 亚洲国产精品久久久久久| 亚洲噜噜噜噜噜影院在线播放| 久久亚洲国产成人影院| 国产精品日本亚洲777| 在线观看亚洲精品福利片|