成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識(shí)庫 > MySQL選錯(cuò)索引的原因以及解決方案

MySQL選錯(cuò)索引的原因以及解決方案

熱門標(biāo)簽:信陽穩(wěn)定外呼系統(tǒng)運(yùn)營商 廣東人工電話機(jī)器人 百度地圖圖標(biāo)標(biāo)注中心 石家莊電商外呼系統(tǒng) 湖南人工外呼系統(tǒng)多少錢 日照旅游地圖標(biāo)注 芒果電話機(jī)器人自動(dòng)化 南通自動(dòng)外呼系統(tǒng)軟件 申請(qǐng)外呼電話線路

MySQL 中,可以為某張表指定多個(gè)索引,但在語句具體執(zhí)行時(shí),選用哪個(gè)索引是由 MySQL 中執(zhí)行器確定的。那么執(zhí)行器選擇索引的原則是什么,以及會(huì)不會(huì)出現(xiàn)選錯(cuò)索引的情況呢?

先看這樣一個(gè)例子:

創(chuàng)建表 Y,設(shè)置兩個(gè)普通索引, 創(chuàng)建一個(gè)存儲(chǔ)過程用于插入數(shù)據(jù)。

MySQL: 5.7.27, 隔離級(jí)別: RR

CREATE TABLE `Y` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `a` int(11) DEFAULT NULL,
 `b` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `a` (`a`),
 KEY `b` (`b`)
) ENGINE=InnoDB;
delimiter ;;
create procedure idata()
begin
 declare i int;
 set i=1;
 while(i=100000)do
   insert into Y (`a`,`b`) values(i, i);
  set i=i+1;
 end while;
end;;
delimiter ;
call idata();

查看如下事務(wù):

Session A Session B
start transaction with consistent snapshot;
delete from t;
call idata();
explain select * from Y where a between 10000 and 20000;
explain select * from Y force index(a) where a between 10000 and 20000;
commit;

如果單獨(dú)執(zhí)行 Session B 中 select * from Y where a between 10000 and 20000;,毫無疑問會(huì)選擇 a 這個(gè)索引。

但如果安裝 Session A,Session B 的順序執(zhí)行,發(fā)現(xiàn)索引的選擇如下:

可以發(fā)現(xiàn),在 Session B 的場(chǎng)景下,執(zhí)行器卻沒有選擇 a 所在的索引,而是選擇基于主鍵索引的全表掃描。

set long_query_time=0;
--將慢查詢?nèi)罩敬蜷_,并將闕值設(shè)為 0. 在記錄的日志中,可以發(fā)現(xiàn) MySQL 并沒有選擇 a 所在的索引,同時(shí)花費(fèi)了更長的時(shí)間。

這樣看,MySQL 的優(yōu)化器不一定每次都能選擇合適的索引。想要理解出現(xiàn)該現(xiàn)象的原因,就要從優(yōu)化器的選擇邏輯說起。

優(yōu)化器

MySQL 中優(yōu)化器的目的就是找到一個(gè)最優(yōu)的執(zhí)行方案,從而用最小的代價(jià)去執(zhí)行語句。

優(yōu)化器在選擇索引時(shí),主要會(huì)考慮如下的因素:

  • 掃描的行數(shù):掃描的行數(shù)越少,就證明訪問磁盤數(shù)據(jù)的次數(shù)越少,消耗的 CPU 資源就越少。
  • 有沒有涉及到臨時(shí)表
  • 排序

關(guān)于掃描行數(shù)的確定

計(jì)算索引的基數(shù)

MySQL 在執(zhí)行語句前,其實(shí)并不能準(zhǔn)確的計(jì)算出掃描的行數(shù),而是通過數(shù)學(xué)統(tǒng)計(jì)信息來估算記錄數(shù)。這個(gè)統(tǒng)計(jì)信息被稱為索引的“區(qū)分度”,在索引上不同的值越多,區(qū)分度就越高。在一個(gè)索引上不同值的個(gè)數(shù),稱為“基數(shù)”?;鶖?shù)越大,索引的區(qū)分度越好。

這里的 Cardinality 就是索引的基數(shù),但基數(shù)并不是完全準(zhǔn)確的。MySQL 是在獲取基數(shù)時(shí),實(shí)際上是采用采樣統(tǒng)計(jì)的方式。

計(jì)算時(shí),會(huì)選擇 N 個(gè)數(shù)據(jù)頁,并統(tǒng)計(jì)這些頁面上的不同值,得到一個(gè)平均值,然后乘以該索引的頁面數(shù),然后得到的就是索引的基數(shù)。

在 MySQL 中,有兩種存儲(chǔ)索引的方式,可通過設(shè)置 innodb_stats_persistent 來切換:

  • on 時(shí):表示統(tǒng)計(jì)信息會(huì)持久化存儲(chǔ),默認(rèn) N 為 20,M 為 10.
  • off 時(shí),統(tǒng)計(jì)信息僅會(huì)存儲(chǔ)在內(nèi)存中,默認(rèn) N 為 8,M 為 16.

由于表中數(shù)據(jù)是不斷變化的,所以當(dāng)更新的值超過 1/M 時(shí),會(huì)自動(dòng)觸發(fā)索引統(tǒng)計(jì)。

但需要注意的是,由于是采樣統(tǒng)計(jì),所以基數(shù)的值不是準(zhǔn)確的。

預(yù)估掃描行數(shù)的錯(cuò)誤

之前看到,執(zhí)行 Select * from Y where a between 10000 and 20000 預(yù)估的行數(shù)是 100015,這個(gè)是能理解的,因?yàn)樽叩氖侨頀呙琛?/p>

之后執(zhí)行 select * from Y force index(a) where a between 10000 and 20000 預(yù)估的行數(shù)是 37116,這個(gè)就不能理解了,理想的情況下應(yīng)該是 10001 行 (需要遍歷到 20001)。

而且更奇怪的是,雖然 37116 行的預(yù)估行數(shù)不太合理,但也遠(yuǎn)小于全表掃描的 100015,為什么優(yōu)化器還是選擇全表掃描呢?

首先先看第二個(gè)問題,選擇 100015 的原因是因?yàn)槿绻褂盟饕?a 的話,除了需要在 a 索引掃描外,還需要回表,主鍵索引上的查詢代價(jià),優(yōu)化器也需要算進(jìn)去,所以選擇了全表掃描。

這時(shí)再看第一個(gè)問題,為什么沒有得到正確的行數(shù)。這個(gè)就和一致性視圖有關(guān)了,首先 Session A 中,開啟了一致性視圖,并沒有提交。之后的 Session 清空了 Y 表后,又重新創(chuàng)建了相同的數(shù)據(jù),這時(shí)每行數(shù)據(jù)都有兩個(gè)版本,舊版本是 delete 前的數(shù)據(jù),新版本是標(biāo)記為刪除的數(shù)據(jù)。所以索引 a 上的數(shù)據(jù)其實(shí)有兩份。也就造成了行數(shù)的預(yù)估錯(cuò)誤。

mysql 是通過標(biāo)記刪除的方法來刪除記錄的,并不是在索引和數(shù)據(jù)文件中真正的刪除。而且由于一致性讀的保證,不能刪除 delete 的空間,再加上 insert 的空間。導(dǎo)致統(tǒng)計(jì)信息有誤。

選用錯(cuò)誤索引的解決辦法

對(duì)于行數(shù)預(yù)估錯(cuò)誤的情況, 可采用如下的方法:

如果遇到 EXPLAIN 和預(yù)估的行數(shù),數(shù)值相差較大時(shí),可以通過analyze table 來重新統(tǒng)計(jì)索引信息。

直接通過 force index 強(qiáng)制指定需要使用的索引,不讓優(yōu)化器進(jìn)行判斷。但使用 force 也可能帶來一些問題:

  • 遷移數(shù)據(jù)庫時(shí),語法不支持
  • 不容易變更并且不太方便,因?yàn)檫x錯(cuò)索引的情況一般不會(huì)經(jīng)常發(fā)生,在生產(chǎn)環(huán)境出現(xiàn)問題后,才需要改代碼,但還需要重新進(jìn)行上線測(cè)試,部署。

優(yōu)化 SQL 語句,引導(dǎo)優(yōu)化器使用正確的索引

再看一個(gè)類似的例子:

先來看一下這句

SQL select * from Y where a between 1 and 1000 and b between5000 100000 order by b limit 1;

在執(zhí)行這句話時(shí),可以選索引 a,也可以選索引 b. 我們知道,每個(gè)索引對(duì)應(yīng)了一顆B+樹。這里由于取得是 a 和 b 的交集,如果選用索引 a 的話,需要遍歷 1 - 10001 行。選用索引 b 需要遍歷 50000 - 100001 行。理論上來說,應(yīng)該選擇 a 作為索引,可以優(yōu)化器又偏偏選擇了 b 作為索引。

這里選擇 b 作為索引的原因,是因?yàn)閮?yōu)化器看到了后面的 order by 語句,由于要排序,而 B+ 樹本身就是有序的,省去了排序的過程,所以選擇了 b 作為索引。

但從實(shí)際的執(zhí)行時(shí)間來看,索引 a 執(zhí)行時(shí)間更短,所以這里 MySQL 又選擇了錯(cuò)誤的索引。

我們可以將上述語句中 order by b limit 改為 order by b,a limit 1 這時(shí)由于 a,b 索引都要排序,掃描的行數(shù)就成為執(zhí)行器主要參考的條件,引導(dǎo)選擇正確的索引。

這樣做的前提一定要保證執(zhí)行的邏輯結(jié)果是一致的,比如在 limit 1 的情況下,order by b,a order by b 的結(jié)果一致,如果換成 limit 100 就不一定了。

還有一種改發(fā)

select * from (select * from t where (a between 1 and 1000) and (b between 50000 and 100000) order by b limit 100)alias limit 1;

現(xiàn)在可以看到,優(yōu)化器選擇了合適的索引。原因在于 limit 100 讓優(yōu)化器認(rèn)為,使用索引 b 的代價(jià)較高,進(jìn)而選擇索引 a. 其實(shí)就是通過 limit 100 誘導(dǎo)優(yōu)化器做出選擇。

調(diào)整索引

能否找到更優(yōu),更合適的索引,或者利用索引的原則,刪除一些不必要的索引。

總結(jié)

現(xiàn)在我們知道,MySQL 在選擇索引時(shí),是會(huì)出現(xiàn)錯(cuò)誤的情況的。優(yōu)化器選擇索引的原則主要有三個(gè),掃描的行數(shù),是否存在臨時(shí)表,以及排序。行數(shù)的掃描,主要和基數(shù)有關(guān),而基數(shù)的統(tǒng)計(jì)則是通過統(tǒng)計(jì)抽樣決定的,進(jìn)而預(yù)估的行數(shù)可能會(huì)是不準(zhǔn)確的。

在遇到掃描的行數(shù)不正確時(shí),可以通過 analyze table 來重新統(tǒng)計(jì)表的信息,通過 force index 強(qiáng)制指定索引,或通過手動(dòng)改變 sql 的語義,誘導(dǎo)優(yōu)化器做出正確的選擇。

以上就是MySQL選錯(cuò)索引的原因以及解決方案的詳細(xì)內(nèi)容,更多關(guān)于MySQL 索引的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • MySQL普通索引和唯一索引的深入講解
  • mysql下普通索引和唯一索引的效率對(duì)比
  • MySql索引提高查詢速度常用方法代碼示例
  • MySQL索引失效的幾種情況匯總
  • MySQL唯一索引和普通索引選哪個(gè)?

標(biāo)簽:合肥 阿里 牡丹江 公主嶺 沈陽 惠州 天津 呼和浩特

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL選錯(cuò)索引的原因以及解決方案》,本文關(guān)鍵詞  MySQL,選錯(cuò),索引,的,原因,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL選錯(cuò)索引的原因以及解決方案》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL選錯(cuò)索引的原因以及解決方案的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    麻豆高清免费国产一区| 日本一级片免费看| 91成人国产在线观看| 精品96久久久久久中文字幕无| 国产乱人伦精品一区二区三区| 国产精品理论在线观看| 草视频在线观看| 免费高潮视频95在线观看网站| 免费人成黄页网站在线一区二区| 少妇高潮久久久久久潘金莲| 57pao国产成永久免费视频| 欧美成人影院| 五月婷婷丁香六月| 亚洲精品爱爱久久| 日韩美女视频在线观看| 一本久久综合亚洲鲁鲁| 亚洲黄色三级| 欧美日韩在线不卡视频| 欧美xxxxxbbbbb| 亚洲午夜未满十八勿入免费观看全集| 一级特黄毛片| 日韩一区二区三区精品视频第3页| 国产日韩精品一区观看| 国内久久婷婷综合| 日韩av123| 午夜少妇久久久久久久久| 亚洲综合激情六月婷婷在线观看| 欧美高清一级片| 中文字幕一区二区精品| 欧美麻豆精品久久久久久| 羞羞答答一区二区| 在线欧美一区二区| 五月婷婷激情五月| 日本一级黄色录像| 亚洲欧美日韩在线观看a三区| 成人在线观看高清| 青青草成人免费| 蜜桃一区二区三区四区| 亚洲小说区图片区都市| 欧美一区激情视频在线观看| 欧美2区3区4区| 亚洲伊人伊色伊影伊综合网| 国产 日韩 欧美 综合 一区| 视频一区二区免费| av资源久久| h网站在线观看| 特黄aaaaaaaaa毛片免费视频| 自拍av在线| 日韩在线免费| 一区二区三区视频在线观看免费| 丰满少妇又爽又紧又丰满电影| 中日韩视频在线观看| 日本午夜在线亚洲.国产| 成人直播在线观看| 大地资源二中文在线影视观看| 久久香蕉国产线看观看网| 国产欧美日韩视频在线| 久久99久久99精品免费看小说| 91精品国产综合久久精品图片| 国产又黄又大久久| 亚洲视频999| 激情五月色综合亚洲小说| 中国黄色在线视频| 99国产精品国产精品毛片| 国产精品一区二区三区视频网站| 97久久超碰福利国产精品…| 欧美国产欧美亚州国产日韩mv天天看完整| 噼里啪啦国语在线观看免费版高清版| 日本不卡高清视频| 成人免费高清在线| 菠萝蜜视频网址| 在线观看黄网站| 成人在线免费小视频| 国产亚洲毛片在线| 久久一区二区三区四区| 黄色成人一级片| 久久激情五月婷婷| 欧美性片在线观看| 欧美精品1区| 伊人久久久久久久久久久久| 亚洲精品一二区| 1024在线看片你懂得| 中文子幕无线码一区tr| 国产又爽又黄无码无遮挡在线观看| 我要看一级黄色录像| 久久久久久九九| 亚洲一区二区三区综合| 亚洲人成电影网站色| 中文字幕另类日韩欧美亚洲嫩草| 中文字幕免费高清电视剧网站在线观看| 成人爽a毛片免费啪啪| 亚洲精品久久久久久宅男| 欧美一区二区精美| 中文字幕42页丝袜| 四虎成人精品永久免费av| 久久免费精品视频在这里| 欧美熟女一区二区| 好看的日韩精品视频在线| 91精品国产91久久久久久不卡| eeuss影院在线播放| 在线观看国产免费视频| 亚洲欧洲一区二区三区在线观看| 波多野结衣有码| 国产精品视频流白浆免费视频| 熟女av一区二区| 成人在线免费观看黄色| 在线亚洲欧美日韩| 午夜一区二区视频| 婷婷社区五月天| 中文字幕免费一区二区三区| 亚洲av成人精品毛片| 欧美精品一区在线观看| 国产精品一区二区三区四| 午夜dj在线观看高清视频完整版| 99久久久无码国产精品衣服| 久久高清国产| 丰满少妇久久久| 国产在线成人| 欧美日韩国产在线一区| av一线二线| 欧美性受xxxx黒人xyx性爽| 日韩欧美亚洲另类| 日韩人在线观看| 26uuu亚洲伊人春色| 亚洲精品欧美在线| 日韩人在线观看| 久久久国产精彩视频美女艺术照福利| 两女双腿交缠激烈磨豆腐| 成人网男人的天堂| 两个人免费视频观看日本| 国产日韩专区| 免费网站www在线观看| 97人人做人人爽香蕉精品| 色老头在线观看| 秋霞成人午夜鲁丝一区二区三区| 九九**精品视频免费播放| 视频二区在线| 国产日韩在线亚洲字幕中文| 俄罗斯精品一区二区三区| 亚洲精品菠萝久久久久久久| 9191在线观看| 亚洲精品国产高清久久伦理二区| 精品亚洲aⅴ乱码一区二区三区| 日本男人天堂网| 尤物视频在线视频| 久久精品国产麻豆| 有码中文亚洲精品| 狠狠88综合久久久久综合网| 国产精品嫩草影院精东| 78m国产成人精品视频| 日本久久网站| 99精品在线直播| 久久久久久成人精品| 国产性生交xxxxx免费| 男女视频在线观看免费| 亚洲激情国产| 国产原创精品在线| 亚洲日本va午夜在线影院| 一区视频网站| 中文字幕一区二区人妻痴汉电车| 亚洲三区在线观看无套内射| 在线国产一级| 免费精品国产| 国产精品久av福利在线观看| 天天在线免费视频| 中文字幕在线播放av| 国产调教精品| jizz欧美性20| 精品久久国产老人久久综合| 久久久国产精品免费| 黄色成人一级片| 欧美私人网站| 欧美性极品videosbest| 日韩精品手机在线| 亚洲一级电影| 成人一区二区三区视频| 欧美三级在线免费观看| 国产精品9999久久久久仙踪林| 亚洲加勒比久久88色综合| www.亚洲国产| 亚洲激情欧美色图| 91精品一区二区三区综合在线爱| 国产精品丝袜一区二区| 免费观看h电影在线观看| 免费看成人人体视频| 成全电影大全在线观看| 中文字幕乱在线伦视频乱在线伦视频| 久久久久蜜桃| 欧美一二三四在线| 成人精品gif动图一区| 国内毛片毛片毛片毛片毛片| 中文字幕在线观看高清| 天堂一区二区在线免费观看| 国产精品网友自拍| 国产日韩视频在线| 久久久一区二区三区| 国产经典三级在线| 88av在线视频| 欧美成人综合一区| 99thz桃花论族在线播放| 国产又黄又爽又无遮挡| 成人a在线视频免费观看| 日韩久久精品视频| 成人动漫在线播放| 两个人的视频www国产精品| 成人盗摄视频| 午夜精品一区二区三区国产| 亚洲天堂av资源在线观看| 久久不见久久见中文字幕免费| 麻豆影视国产在线观看| 欧美与黑人午夜性猛交久久久| 国产精品亚洲二区| 国产免费黄色一级片| 午夜精品久久久久久久久久久| 九九综合九九综合| 亚洲综合视频网| 精品人妻久久久久一区二区三区| 中文字幕欧美精品日韩中文字幕| 久久这里只有精品1| 在线播放一区二区精品视频| 国产av无码专区亚洲av| 九九热在线免费观看| 国产精品中文字幕亚洲欧美| 国产日韩欧美在线播放| 91一区二区三区在线观看| 精品久久对白| 97香蕉超级碰碰久久免费的优势| 成人久久视频在线观看| 美足av综合网| 精品日产一区2区三区黄免费| 99精品欧美一区二区三区小说| 亚洲综合网狠久久| 欧美在线三级| a级片在线免费看| 国产精品动漫网站| 精品一区二区三区免费观看| 最新在线地址| 亚洲另类激情图| 男人的天堂成人| 波多野结衣亚洲一二三| 国产成人自拍视频在线观看| 亚洲三级黄色在线观看| 男女免费网站| 秋霞av亚洲一区二区三| 一个人看的www视频在线免费观看| 国产精品第一页第二页第三页| 阿v天堂2018| 欧美性xxxxxxxx| 亚洲乱码国产一区三区| 久久天天躁狠狠躁夜夜躁2014| 久久99深爱久久99精品| 中文字幕无码人妻少妇免费| 日韩精品视频免费播放| 疯狂揉花蒂控制高潮h| 日韩成人av在线资源| 国产成人无码av在线播放dvd| 欧美一区二区| 欧美黄色一级生活片| 91在线视频免费91| 人妻精品一区二区三区| 亚洲国产成人精品无码区99| 一道本在线免费视频| 激情综合色播激情啊| 国产日韩欧美在线播放| 97偷自拍亚洲综合二区| 日b视频免费观看| 男人午夜影院| 亚洲综合av一区二区三区| 国产精品色婷婷视频| 久久夜色精品国产噜噜av| 亚洲成人免费影院| 天天做天天爱天天爽综合网| 91久久免费视频| 成人av午夜影院| 亚洲欧美精品在线观看| wwwav91com| 99re国产在线| 欧美久久久久久久久中文字幕| 青少年xxxxx性开放hg| 欧美亚洲成人精品| 国产一线二线三线女| 伊人伊成久久人综合网小说| 国产免费av高清在线| 秋霞影院一区二区三区| 日韩欧美一区二区三区免费观看| 亚洲瘦老头同性70tv| 国产午夜精品一区二区三区欧美| 国产伦精品一区二区三区视频网站| 成人小视频在线观看免费| 欧美xxxx日本和非洲| 91视频你懂的| 中文字幕精品亚洲| av男人的天堂在线观看| 黄色三级小视频| 国产成人精品免费视频大全软件| 亚洲二区在线观看| 中文字幕一区二区三区色视频| 中文字幕乱码无码人妻系列蜜桃| 久久久亚洲国产美女国产盗摄| 国产草草影院ccyycom| 午夜色香蕉导航| 国产麻豆91精品| 致1999电视剧免费观看策驰影院| 制服丝袜网站| 欧美日韩激情在线观看| 欧美日韩精品一区二区三区四区| 亚洲欧美日韩综合网| 一级片免费在线观看视频| 欧美aa在线视频| 色视频www在线播放国产人成| 日本韩国精品一区二区在线观看| 狠狠干天天爱| 成人福利片网站| 情趣视频网站在线免费观看| 日韩精品久久一区| 久久久久久自在自线| 伊人春色之综合网| 26uuuu精品一区二区| 成人在线免费小视频| aaa日本高清在线播放免费观看| 最近中文字幕mv2018在线高清| 91超碰免费在线| 亚洲欧美经典视频| 97se亚洲国产综合自在线观| 日本久久高清视频| www.日韩欧美| 久久久久精彩视频| 久久久精品欧美|