最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談MySQL為什么會選錯索引

 更新時間:2023年03月20日 11:09:59   作者:XHHP  
本文主要介紹了淺談MySQL為什么會選錯索引,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.引例

首先創(chuàng)建一張表,并對字段a,b分別建立索引:

create table t (
    id int(11) not null,
    a int(11) default null,
    b int(11) default null,
    primary key (id),
    key a(a),
    key b(b)
)engine=InnoDB;

然后往表中,插入十萬行數(shù)據(jù),值按整數(shù)遞增:(1,1,1)、(2,2,2)、(3,3,3)…

delimiter ;;
create PROCEDURE insertdata()
begin 
	declare i int;
	set i=1;
	while(i<=100000) DO
		insert into t values(i,i,i);
		set i = i+1;
	end while;
end;;
delimiter ;
call insertdata();

接下來,我們執(zhí)行一條sql:

mysql >explain select * from t where a between 10000 and 20000;

執(zhí)行結(jié)果:

結(jié)果中的“key”字段就代表了查詢中使用的索引。所以這條語句走了索引a,沒什么問題。

我們再來執(zhí)行如下操作:

但是這個時候session B的查詢語句select * from t where a between 10000 and 20000就不會再選擇索引a。

為了比較使用索引和不使用的查詢性能對比,執(zhí)行下面的語句:

set long_query_time=0;
select * from t where a between 10000 and 20000;
select * from t force(a) where a between 10000 and 20000;

下面是兩種慢查詢?nèi)罩局械慕Y(jié)果對比:

第一個查詢查找了十萬行,第二個查詢走了索引,查找了一萬行,速度明顯比較快。

那為什么會選錯索引呢?

2.優(yōu)化器的邏輯

選擇索引是優(yōu)化器的工作,優(yōu)化器選擇索引的目的,就是想要找到一個最優(yōu)的執(zhí)行方案,并用最小的代價去執(zhí)行。

在數(shù)據(jù)庫里面,掃描行數(shù)是影響執(zhí)行代價的因素之一。掃描行數(shù)越少,意味著訪問磁盤次數(shù)越少。但是掃描行數(shù)并不是唯一的評價標(biāo)準(zhǔn),還會考慮臨時表,是否排序等因素。

那掃描行數(shù)是如何判斷的?
MySQL在真正執(zhí)行之前,只能根據(jù)統(tǒng)計信息來估算記錄數(shù)。這個統(tǒng)計信息就是索引的“區(qū)分度”。 一個索引上不同的值越多,這個索引的區(qū)分度就越好。而一個索引上不同的值的個數(shù),我們稱之為“基數(shù)”(cardinality)。也就是說,這個基數(shù)越大,索引的區(qū)分度越好。

我們可以用show index的方法看到不同索引的基數(shù)值,但是可以看到統(tǒng)計信息并不是太準(zhǔn)確。 可以使用analyze table t來重新統(tǒng)計,但是也不一定準(zhǔn)確。

那MySQL是如何得到索引的基數(shù)呢?
答案是MySQL會采取采樣統(tǒng)計的方法,默認(rèn)會選擇N個數(shù)據(jù)頁,統(tǒng)計這些頁面上的不同值,得到平均值,再乘以總的頁面數(shù)。

在MySQL中,有兩種存儲索引統(tǒng)計的方式,可以通過設(shè)置innodb_stats_persisten來設(shè)置:

  • 設(shè)置為on的時候,表示統(tǒng)計信息會持久化存儲。這時,默認(rèn)的N是20,M是10
  • 設(shè)置為off的時候,表示統(tǒng)計信息只存儲在內(nèi)存中。這時,默認(rèn)的N是8,M是16

我們再來比較兩個語句預(yù)估的查詢行數(shù),如下圖:

圖中的row字段就代表預(yù)估的查詢行數(shù)。對于第一條語句,預(yù)估的查詢行數(shù)是104620.第二條語句,預(yù)估的查詢行數(shù)是37116。明顯第二條語句的查詢行數(shù)少,那為什么沒有選擇索引a呢?

這是因為,如果使用索引a,每次從索引a上拿到一個值,都要回表查詢。而如果選擇掃描十萬行的語句,則不需要回表。因此優(yōu)化器評估這兩條語句時,覺得回表查詢更耗費時間,所以沒有使用索引。但是實際中,這種方式并不是最優(yōu)的。

3.解決辦法

第一種解決辦法是和第二條語句一樣,采用force index強(qiáng)行選擇一個索引。如果force index指定的索引在候選索引列表中,就直接選擇這個索引,而不再去評估執(zhí)行代價。但是這種方式不太優(yōu)雅,而且改了索引名,語句也要改

第二種解決辦法是考慮修改sql語句,引導(dǎo)MySQL使用我們期望的索引。

第三種解決辦法是新建一個更合適的索引,刪除掉誤用的索引。

到此這篇關(guān)于淺談MySQL為什么會選錯索引的文章就介紹到這了,更多相關(guān)MySQL 選錯索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • IDEA無法連接mysql數(shù)據(jù)庫的6種解決方法大全

    IDEA無法連接mysql數(shù)據(jù)庫的6種解決方法大全

    這篇文章主要介紹了IDEA無法連接mysql數(shù)據(jù)庫的6種解決方法大全,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 為什么在MySQL中不建議使用UTF-8

    為什么在MySQL中不建議使用UTF-8

    在本篇文章里小編給大家分享了一篇關(guān)于MySQL中不要使用UTF-8的相關(guān)文章,有興趣的朋友們可以閱讀參考下。
    2020-12-12
  • MySql?InnoDB存儲引擎之Buffer?Pool運行原理講解

    MySql?InnoDB存儲引擎之Buffer?Pool運行原理講解

    緩沖池是用于存儲InnoDB表,索引和其他輔助緩沖區(qū)的緩存數(shù)據(jù)的內(nèi)存區(qū)域。緩沖池的大小對于系統(tǒng)性能很重要。更大的緩沖池可以減少磁盤I/O來多次訪問同一表數(shù)據(jù)。在專用數(shù)據(jù)庫服務(wù)器上,可以將緩沖池大小設(shè)置為計算機(jī)物理內(nèi)存大小的百分之80
    2023-01-01
  • Mysql如何設(shè)置表主鍵id從1開始遞增

    Mysql如何設(shè)置表主鍵id從1開始遞增

    這篇文章主要介紹了Mysql如何設(shè)置表主鍵id從1開始遞增問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • winx64下mysql5.7.19的基本安裝流程(詳細(xì))

    winx64下mysql5.7.19的基本安裝流程(詳細(xì))

    這篇文章主要介紹了winx64下mysql5.7.19的基本安裝流程,需要的朋友可以參考下
    2017-10-10
  • 淺析mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化

    淺析mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化

    本篇文章是對mysql 共享表空間與獨享表空間以及他們之間的轉(zhuǎn)化進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql全量備份和快速恢復(fù)的方法整理

    mysql全量備份和快速恢復(fù)的方法整理

    在本篇文章里小編給各位整理的是關(guān)于mysql全量備份和快速恢復(fù)的方法整理內(nèi)容,需要的朋友們可以參考下。
    2020-03-03
  • MySQL中怎么匹配年月

    MySQL中怎么匹配年月

    一般數(shù)據(jù)庫中給到的時間都是年-月-日形式的,那怎么匹配年-月/的形式呢,下面通過實例代碼介紹怎么在數(shù)據(jù)庫中查詢到關(guān)于2021年8月的數(shù)據(jù),對mysql匹配年月相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 淺談innodb_autoinc_lock_mode的表現(xiàn)形式和選值參考方法

    淺談innodb_autoinc_lock_mode的表現(xiàn)形式和選值參考方法

    下面小編就為大家?guī)硪黄獪\談innodb_autoinc_lock_mode的表現(xiàn)形式和選值參考方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • mysql 5.7.17 winx64解壓版安裝配置方法圖文教程

    mysql 5.7.17 winx64解壓版安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.17 winx64解壓版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06

最新評論

平阳县| 龙岩市| 叙永县| 家居| 隆子县| 驻马店市| 巧家县| 尉氏县| 额济纳旗| 延寿县| 日土县| 海林市| 太白县| 汾西县| 新昌县| 赫章县| 绥滨县| 沙坪坝区| 柳林县| 桃江县| 仪陇县| 绥化市| 宜章县| 湘乡市| 张家界市| 同心县| 东乡族自治县| 龙州县| 三明市| 连城县| 和顺县| 克什克腾旗| 南丰县| 石狮市| 廊坊市| 吉木萨尔县| 商南县| 栖霞市| 大石桥市| 凤翔县| 内黄县|