欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文詳解MySQL8.0的索引新特性

 更新時間:2023年07月21日 09:29:44   作者:我有一顆五葉草  
MySQL中的索引可以為提高我們的查詢效率,相比較于低版本, MySQL 8.0中針對索引做了不少的優(yōu)化,本文主要給大家分享一些MySQL8.0索引的新特性,希望大家可以在日常的開發(fā)中根據(jù)實際場景用起來

1 支持降序索引

舉例:分別在MySQL 5.7版本和MySQL 8.0版本中創(chuàng)建數(shù)據(jù)表ts1,結(jié)果如下:

CREATE TABLE ts1(
  a int,
  b int,
  index idx_a_b(a,b desc)
);

在MySQL 5.7版本中查看數(shù)據(jù)表ts1的結(jié)構(gòu),從結(jié)果可以看出,索引仍然是默認的升序。

在MySQL 8.0版本中查看數(shù)據(jù)表ts1的結(jié)構(gòu),從結(jié)果可以看出,索引已經(jīng)是降序了。下面繼續(xù)測試降序索引在執(zhí)行計劃中的表現(xiàn)。

分別在MySQL 5.7版本和MySQL 8.0版本的數(shù)據(jù)表ts1中插入800條隨機數(shù)據(jù),執(zhí)行語句如下:

DELIMITER //
CREATE PROCEDURE ts_insert()
BEGIN
  DECLARE i INT DEFAULT 1;
  WHILE i < 800
  DO
    insert into ts1 select rand()80000,rand()80000;
    SET i = i + 1;
  END WHILE;
  commit;
END //
DELIMITER ;
# 調(diào)用
CALL ts_insert();

在MySQL 5.7版本中查看數(shù)據(jù)表ts1的執(zhí)行計劃,結(jié)果如下:

EXPLAIN SELECT * FROM ts1 ORDER BY a,b DESC LIMIT 5;

從結(jié)果可以看出,執(zhí)行計劃中掃描數(shù)為799,而且使用了Using filesort。
提示 Using filesort是MySQL中一種速度比較慢的外部排序,能避免是最好的。多數(shù)情況下,管理員
可以通過優(yōu)化索引來盡量避免出現(xiàn)Using filesort,從而提高數(shù)據(jù)庫執(zhí)行速度。

在MySQL 8.0版本中查看數(shù)據(jù)表ts1的執(zhí)行計劃。從結(jié)果可以看出,執(zhí)行計劃中掃描數(shù)為5,而且沒有使用Using filesort。
注意 降序索引只對查詢中特定的排序順序有效,如果使用不當,反而查詢效率更低。例如,上述查詢排序條件改為order by a desc, b desc,MySQL 5.7的執(zhí)行計劃要明顯好于MySQL 8.0。

將排序條件修改為order by a desc, b desc后,下面來對比不同版本中執(zhí)行計劃的效果。 在MySQL 5.7版本中查看數(shù)據(jù)表ts1的執(zhí)行計劃,結(jié)果如下:

EXPLAIN SELECT * FROM ts1 ORDER BY a DESC,b DESC LIMIT 5;

在MySQL 8.0版本中查看數(shù)據(jù)表ts1的執(zhí)行計劃。

從結(jié)果可以看出,修改后MySQL 5.7的執(zhí)行計劃要明顯好于MySQL 8.0。

2 隱藏索引

在MySQL 5.7版本及之前,只能通過顯式的方式刪除索引。此時,如果發(fā)現(xiàn)刪除索引后出現(xiàn)錯誤,又只能通過顯式創(chuàng)建索引的方式將刪除的索引創(chuàng)建回來。如果數(shù)據(jù)表中的數(shù)據(jù)量非常大,或者數(shù)據(jù)表本身比較大,這種操作就會消耗系統(tǒng)過多的資源,操作成本非常高。

從MySQL 8.x 開始支持 隱藏索引(invisible indexes) ,只需要將待刪除的索引設(shè)置為隱藏索引,使查詢優(yōu)化器不再使用這個索引(即使使用force index(強制使用索引),優(yōu)化器也不會使用該索引),

確認將索引設(shè)置為隱藏索引后系統(tǒng)不受任何響應(yīng),就可以徹底刪除索引。 這種通過先將索引設(shè)置為隱藏索引,再刪除索引的方式就是軟刪除 。

同時你想驗證某個索引刪除之后的 查詢性能影響就可以暫時先隱藏起來。

注意:主鍵不能被設(shè)置為隱藏索引。當表中沒有顯示主鍵時,表中的第一個唯一非空索引會成為隱式主鍵,也不能設(shè)置為隱藏索引。

  • 創(chuàng)建表時直接創(chuàng)建

在MySQL中創(chuàng)建隱藏索引通過SQL語句INVISIBLE來實現(xiàn),其語法形式如下:

CREATE TABLE tablename(
propname1 type1[CONSTRAINT1],
propname2 type2[CONSTRAINT2],
……
propnamen typen,
INDEX [indexname](propname1 [(length)]) INVISIBLE
);

上述語句比普通索引多了一個關(guān)鍵字INVISIBLE,用來標記索引為不可見索引。

  • 在已經(jīng)存在的表上創(chuàng)建
    可以為已經(jīng)存在的表設(shè)置隱藏索引,其語法形式如下:
CREATE INDEX indexname
ON tablename(propname[(length)]) INVISIBLE;
  • 通過ALTER TABLE語句創(chuàng)建
    語法形式如下:
ALTER TABLE tablename
ADD INDEX indexname (propname [(length)]) INVISIBLE;
  • 切換索引可見狀態(tài)
    已存在的索引可通過如下語句切換可見狀態(tài):
ALTER TABLE tablename ALTER INDEX index_name INVISIBLE; #切換成隱藏索引
ALTER TABLE tablename ALTER INDEX index_name VISIBLE; #切換成非隱藏索引

如果將index_cname索引切換成可見狀態(tài),通過explain查看執(zhí)行計劃,發(fā)現(xiàn)優(yōu)化器選擇了index_cname索引。
注意 當索引被隱藏時,它的內(nèi)容仍然是和正常索引一樣實時更新的。如果一個索引需要長期被隱藏,那么可以將其刪除,因為索引的存在會影響插入、更新和刪除的性能。

通過設(shè)置隱藏索引的可見性可以查看索引對調(diào)優(yōu)的幫助。

  • 使隱藏索引對查詢優(yōu)化器可見

在MySQL 8.x版本中,為索引提供了一種新的測試方式,可以通過查詢優(yōu)化器的一個開關(guān)(use_invisible_indexes)來打開某個設(shè)置,使隱藏索引對查詢優(yōu)化器可見。如果 use_invisible_indexes
設(shè)置為off(默認),優(yōu)化器會忽略隱藏索引。如果設(shè)置為on,即使隱藏索引不可見,優(yōu)化器在生成執(zhí)行計劃時仍會考慮使用隱藏索引。

(1)在MySQL命令行執(zhí)行如下命令查看查詢優(yōu)化器的開關(guān)設(shè)置。

mysql> select @@optimizer_switch \G

在輸出的結(jié)果信息中找到如下屬性配置

use_invisible_indexes=off

此屬性配置值為off,說明隱藏索引默認對查詢優(yōu)化器不可見。

(2)使隱藏索引對查詢優(yōu)化器可見,需要在MySQL命令行執(zhí)行如下命令:

mysql> set session optimizer_switch="use_invisible_indexes=on";
Query OK, 0 rows affected (0.00 sec)

SQL語句執(zhí)行成功,再次查看查詢優(yōu)化器的開關(guān)設(shè)置。

mysql> select @@optimizer_switch \G
*************************** 1. row ***************************
@@optimizer_switch:
index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_
intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_co
st_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on
,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on
,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on,use_invisible_ind
exes=on,skip_scan=on,hash_join=on
1 row in set (0.00 sec)

此時,在輸出結(jié)果中可以看到如下屬性配置

use_invisible_indexes=on

use_invisible_indexes屬性的值為on,說明此時隱藏索引對查詢優(yōu)化器可見。

(3)使用EXPLAIN查看以字段invisible_column作為查詢條件時的索引使用情況。

explain select * from classes where cname = '高一2班';

查詢優(yōu)化器會使用隱藏索引來查詢數(shù)據(jù)。

(4)如果需要使隱藏索引對查詢優(yōu)化器不可見,則只需要執(zhí)行如下命令即可。

mysql> set session optimizer_switch="use_invisible_indexes=off";
Query OK, 0 rows affected (0.00 sec)

此時,use_invisible_indexes屬性的值已經(jīng)被設(shè)置為“off”。

到此這篇關(guān)于一文詳解MySQL8.0的索引新特性的文章就介紹到這了,更多相關(guān)MySQL8.0索引新特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 分享MYSQL插入數(shù)據(jù)時忽略重復(fù)數(shù)據(jù)的方法

    分享MYSQL插入數(shù)據(jù)時忽略重復(fù)數(shù)據(jù)的方法

    當程序中insert時,已存在的數(shù)據(jù)不插入,不存在的數(shù)據(jù)insert。在網(wǎng)上搜了下,可以使用存儲過程或者是用NOT EXISTS 來判斷是否存在
    2013-09-09
  • mysql 子查詢與連接表詳情

    mysql 子查詢與連接表詳情

    這篇文章主要介紹了mysql 子查詢與連接表,格式化SQL 包含子查詢的SELECT語句難以閱讀和調(diào)試,特別是它們較為復(fù)雜時更是如此,對于能嵌套的子查詢的數(shù)目沒有限制,不過在實際使用時由于性能的限制,不能嵌套太多的子查詢,下面請跟雄安邊一起來看看詳細內(nèi)容吧
    2021-10-10
  • Python?Matplotlib繪圖基礎(chǔ)詳細教程

    Python?Matplotlib繪圖基礎(chǔ)詳細教程

    matplotlib是python中用于繪制各種圖像的模塊,功能十分強大,通常與pandas模塊搭配使用,可以生成各種樣視的圖片,用于數(shù)據(jù)的分析和展示,下面這篇文章主要給大家介紹了關(guān)于Python?Matplotlib繪圖基礎(chǔ)的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 系統(tǒng)高吞吐量下的數(shù)據(jù)庫重復(fù)寫入問題分析解決

    系統(tǒng)高吞吐量下的數(shù)據(jù)庫重復(fù)寫入問題分析解決

    這篇文章主要介紹了系統(tǒng)高吞吐量下的數(shù)據(jù)庫重復(fù)寫入問題分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • MySQL查詢語句過程和EXPLAIN語句基本概念及其優(yōu)化

    MySQL查詢語句過程和EXPLAIN語句基本概念及其優(yōu)化

    在MySQL中我們經(jīng)常會使用到一些查詢語句,如果使用合適的索引會大大簡化和加速查找,下面小編來和大家一起學(xué)習(xí)一下知識
    2019-05-05
  • 使用mysql語句查看數(shù)據(jù)庫表所占容量空間大小

    使用mysql語句查看數(shù)據(jù)庫表所占容量空間大小

    這篇文章主要給大家介紹了關(guān)于如何使用mysql語句查看數(shù)據(jù)庫表所占容量空間大小的相關(guān)資料,如何在MySQL數(shù)據(jù)庫管理中查詢數(shù)據(jù)庫、表、索引的容量大小是經(jīng)常遇到的需求,需要的朋友可以參考下
    2023-08-08
  • Mysql忘記密碼怎么重置密碼的幾種實現(xiàn)方法

    Mysql忘記密碼怎么重置密碼的幾種實現(xiàn)方法

    本文主要介紹了Mysql忘記密碼怎么重置密碼的幾種實現(xiàn)方法,每種方法都有其適用的情況,根據(jù)具體情況選擇合適的方法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • MySQL數(shù)據(jù)庫學(xué)習(xí)之分組函數(shù)詳解

    MySQL數(shù)據(jù)庫學(xué)習(xí)之分組函數(shù)詳解

    這篇文章主要為大家詳細介紹一下MySQL數(shù)據(jù)庫中分組函數(shù)的使用,文中的示例代碼講解詳細,對我們學(xué)習(xí)MySQL有一定幫助,需要的可以參考一下
    2022-07-07
  • SQL函數(shù)實現(xiàn)Group_concat用法

    SQL函數(shù)實現(xiàn)Group_concat用法

    GROUP_CONCAT用于將每個分組內(nèi)的值連接成一個字符串,并通過指定的分隔符進行分隔,本文主要介紹了SQL函數(shù)實現(xiàn)Group_concat用法,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • MYSQL每隔10分鐘進行分組統(tǒng)計的實現(xiàn)方法

    MYSQL每隔10分鐘進行分組統(tǒng)計的實現(xiàn)方法

    這篇文章主要給大家介紹了如何利用MYSQL實現(xiàn)每隔10分鐘進行分組統(tǒng)計的方法,文中給出了詳細的示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友們下面來一起看看吧。
    2016-12-12

最新評論