MySQL8.0中你必須要知道的索引新特性
前言
MySQL中的索引可以為提高我們的查詢效率,相比較于低版本, MySQL 8.0中針對(duì)索引做了不少的優(yōu)化,本文主要分享下MySQL8.0中關(guān)于索引的兩個(gè)新特性,這兩個(gè)新特性都非常好用,希望大家可以在日常的開發(fā)中根據(jù)實(shí)際場(chǎng)景用起來。
支持索引降序排序
降序索引說明
在建立的索引可以指定索引的順序,命令如下:
ALTER TABLE table_name ADD [UNIQUE] [INDEX | KEY] [index_name] (col_name[length],...) [ASC | DESC]
ASC
表示升序、DESC
表示索引降序排序- 從MySQL4版本中就開始支持DESC的語法,但是實(shí)際上會(huì)忽略它,指導(dǎo)MySQL8.x innoDB存儲(chǔ)引擎才支持降序排序。
例子:在MySQL5.x中創(chuàng)建DESC降序索引無效
- 在MySQL5.7.16中創(chuàng)建降序索引
create table student ( id_ int(10) AUTO_INCREMENT, student_no varchar(50), student_name varchar(200), update_time datetime, primary key (id_), unique index idx_no(student_no desc) )
- 創(chuàng)建了降序索引
idx_no
- 我們用
show create table student;
查看表的信息。
- 同樣,我們?cè)贛ySQL8中查看表的信息,如下圖:
降序索引好處
你可能疑惑了,那我為什么要設(shè)置索引為降序,有什么好處呢?
其實(shí)這和我們實(shí)際的業(yè)務(wù)場(chǎng)景息息相關(guān),比如我們的場(chǎng)景中如果存在一個(gè)查詢,需要對(duì)多個(gè)列進(jìn)行排序,且順序要求不一致,那么使用降序索引將會(huì)避免數(shù)據(jù)庫使用額外的文件排序操作,從而提高性能。如果只對(duì)單個(gè)列進(jìn)行排序,降序索引的意義不是太大,無論是升序還是降序,升序索引完全可以應(yīng)付。詳細(xì)內(nèi)容請(qǐng)參考文章:http://chabaoo.cn/article/143464.htm。
那么降序索引的底層數(shù)據(jù)結(jié)構(gòu)是什么樣的呢?下圖是基于student表建立的降序索引對(duì)應(yīng)的B+樹結(jié)構(gòu):
- 頁10和頁12是對(duì)應(yīng)的數(shù)據(jù)頁,存放數(shù)據(jù),其中
update_time
字段對(duì)應(yīng)的值是降序排序,這也是DESC
的體現(xiàn)。 - 頁20是目錄頁,存放索引,它也是降序排序的。
索引數(shù)據(jù)結(jié)構(gòu)詳細(xì)請(qǐng)參考:一步步帶你設(shè)計(jì)MySQL索引數(shù)據(jù)結(jié)構(gòu)。
支持索引的隱藏
隱藏索引的說明
MySQL 8.0 支持了 Invisible Indexes
隱藏索引 這個(gè)特性,可以把某個(gè)索引設(shè)置為對(duì)優(yōu)化器不可見,生成查詢計(jì)劃時(shí)便不使用這個(gè)索引了,但這個(gè)索引還是被正常維護(hù)的,例如表數(shù)據(jù)變更后還是會(huì)更新索引。
我們可以通過在創(chuàng)建索引的時(shí)候設(shè)置索引的隱藏屬性,如下:
ALTER TABLE tablename ADD INDEX indexname (propname [(length)]) INVISIBLE;
也可以對(duì)已經(jīng)存在的索引切換顯示或者隱藏,語法如下:
ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切換成隱藏索引 ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切換成非隱藏索引
隱藏索引的好處
眾所周知,索引的維護(hù)是需要極大的成本的,數(shù)據(jù)量越大,建立索引花費(fèi)的成本也就越大。但是,往往我們?cè)谡{(diào)優(yōu)的時(shí)候有這樣的需求,我們想要看看禁用掉這個(gè)索引對(duì)查詢性能的影響,如果在8.0版本以前,都是要?jiǎng)h除這個(gè)索引,發(fā)現(xiàn)這個(gè)索引有用的,又要加回來,極大的增加了操作成本。
所以隱藏索引最明顯的一個(gè)作用類似索引回收站。
例如數(shù)據(jù)庫長時(shí)間運(yùn)行后,會(huì)積累很多索引,做數(shù)據(jù)庫優(yōu)化時(shí),想清理掉沒什么用的多余的索引,但可能刪除某個(gè)索引后,數(shù)據(jù)庫性能下降了,發(fā)現(xiàn)這個(gè)索引時(shí)有用的,就要重新建立。這時(shí)候隱藏索引就派上用場(chǎng)了。
總結(jié)
本文分享了MySQL8.0中關(guān)于索引的兩個(gè)新特性,一個(gè)是支持降序索引,另外一個(gè)是支持隱藏索引,他們都是有著非常強(qiáng)的實(shí)用價(jià)值的。
到此這篇關(guān)于MySQL8.0中你必須要知道的索引新特性的文章就介紹到這了,更多相關(guān)MySQL8.0索引新特性內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL的主從復(fù)制步驟詳解及常見錯(cuò)誤解決方法
這篇文章主要介紹了MySQL的主從復(fù)制步驟詳解及常見錯(cuò)誤解決方法,文中主張同步時(shí)跳過臨時(shí)錯(cuò)誤,并對(duì)Slave_IO_Running: No錯(cuò)誤的解決給出了方案,需要的朋友可以參考下2016-02-02SPSS連接mysql數(shù)據(jù)庫的超詳細(xì)操作教程
小編最近在學(xué)習(xí)SPSS,在為數(shù)據(jù)庫建立連接時(shí)真的踩了很多坑,這篇文章主要給大家介紹了關(guān)于SPSS連接mysql數(shù)據(jù)庫的超詳細(xì)操作教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02win2003服務(wù)器下配置 MySQL 群集(Cluster)的方法
MySQL 群集是 MySQL 適合于分布式計(jì)算環(huán)境的高可用、高冗余版本。它采用了 NDB Cluster 存儲(chǔ)引擎,允許在 1 個(gè)群集中運(yùn)行多個(gè) MySQL 服務(wù)器。2010-12-12rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲(chǔ)位置的實(shí)現(xiàn)
在Linux環(huán)境下進(jìn)行MySQL的安裝可以使用不同的方式,但在本文中我們將關(guān)注一種特定的方式,即通過RPM包的方式進(jìn)行安裝,本文主要介紹了rpm -ivh方式安裝mysql并修改數(shù)據(jù)存儲(chǔ)位置的實(shí)現(xiàn),感興趣的可以了解一下2023-09-09MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作
這篇文章主要介紹了MySQL數(shù)據(jù)庫之?dāng)?shù)據(jù)表操作,文章基于MySQL數(shù)據(jù)庫的相關(guān)資料展開詳細(xì)的數(shù)據(jù)表操作的詳情,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù)示例
這篇文章主要介紹了mysql實(shí)現(xiàn)查詢最接近的記錄數(shù)據(jù),涉及mysql查詢相關(guān)的時(shí)間轉(zhuǎn)換、排序等相關(guān)操作技巧,需要的朋友可以參考下2018-07-07MySQL學(xué)習(xí)筆記之?dāng)?shù)據(jù)的增、刪、改實(shí)現(xiàn)方法
這篇文章主要介紹了MySQL學(xué)習(xí)筆記之?dāng)?shù)據(jù)的增、刪、改實(shí)現(xiàn)方法,簡單介紹了mysql實(shí)現(xiàn)數(shù)據(jù)的增、刪、改相關(guān)語法與使用技巧,需要的朋友可以參考下2016-09-09