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

主頁 > 知識(shí)庫 > mysql回表致索引失效案例講解

mysql回表致索引失效案例講解

熱門標(biāo)簽:高清地圖標(biāo)注道路 大眾點(diǎn)評(píng)星級(jí)酒店地圖標(biāo)注 臨清電話機(jī)器人 云南電商智能外呼系統(tǒng)價(jià)格 拉卡拉外呼系統(tǒng) 智能外呼系統(tǒng)復(fù)位 話務(wù)外呼系統(tǒng)怎么樣 400電話可以辦理嗎 外東北地圖標(biāo)注

簡(jiǎn)介

mysql的innodb引擎查詢記錄時(shí)在無法使用索引覆蓋的場(chǎng)景下,需要做回表操作獲取記錄的所需字段。

mysql執(zhí)行sql前會(huì)執(zhí)行sql優(yōu)化、索引選擇等操作,mysql會(huì)預(yù)估各個(gè)索引所需要的查詢代價(jià)以及不走索引所需要的查詢代價(jià),從中選擇一個(gè)mysql認(rèn)為代價(jià)最小的方式進(jìn)行sql查詢操作。而在回表數(shù)據(jù)量比較大時(shí),經(jīng)常會(huì)出現(xiàn)mysql對(duì)回表操作查詢代價(jià)預(yù)估代價(jià)過大而導(dǎo)致索引使用錯(cuò)誤的情況。

案例

示例如下,在5.6版本的mysql、1CPU2G內(nèi)存的Linux環(huán)境下,新建一個(gè)測(cè)試表,并創(chuàng)建將近200萬的記錄用于測(cè)試。

CREATE TABLE `salary_static` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主鍵',
  `school_id` int(11) NOT NULL COMMENT '學(xué)校id',
  `student_id` int(11) NOT NULL COMMENT '畢業(yè)生id',
  `salary` int(11) NOT NULL DEFAULT '0' COMMENT '畢業(yè)薪水',
  `year` int(11) NOT NULL COMMENT '畢業(yè)年份',
  PRIMARY KEY (`id`),
  KEY `school_id_key` (`school_id`) USING BTREE,
  KEY `year_school_key` (`year`,`school_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='畢業(yè)生薪水?dāng)?shù)據(jù)統(tǒng)計(jì)';
delimiter  //
CREATE PROCEDURE init_salary_static() 
BEGIN 
	DECLARE year INT;
	DECLARE schid INT;
	DECLARE stuid INT;
	SET year = 2000;
	WHILE year  2020 DO
		START TRANSACTION; 
		SET schid = 1;
		WHILE schid  100 DO
			SET stuid = 1;
			WHILE stuid  1000 DO
				insert into salary_static(school_id,student_id,salary,year) values (schid,stuid,floor(rand()*10000),year);
				SET stuid = stuid + 1;
			END WHILE;
			SET schid = schid + 1;
		END WHILE;
		SET year = year + 1;
		COMMIT; 
	END WHILE;
END //
delimiter ;
call init_salary_static();

測(cè)試數(shù)據(jù)創(chuàng)建完成后,執(zhí)行以下sql語句進(jìn)行統(tǒng)計(jì)查詢。

select school_id,avg(salary) from salary_static where year between 2016 and 2019 group by school_id;

預(yù)計(jì)該sql應(yīng)該使用year_school_key索引進(jìn)行查詢,但實(shí)際上通過explain命令可以發(fā)現(xiàn),該sql使用的是school_id_key索引,并且由于使用了錯(cuò)誤的索引,該sql進(jìn)行了全表掃描導(dǎo)致查詢時(shí)間花費(fèi)了7秒。

強(qiáng)制使用year_school_key索引進(jìn)行查詢后發(fā)現(xiàn),該sql的查詢時(shí)間花費(fèi)銳減到了0.6秒,比起school_id_key索引的時(shí)間減少了10倍。

select school_id,avg(salary) from salary_static force index(year_school_key) where year between 2015 and 2019 group by school_id;

分析

使用mysql的optimizer tracing(mysql5.6版本開始支持)功能來分析sql的執(zhí)行計(jì)劃:

SET optimizer_trace="enabled=on";
select school_id,avg(salary) from salary_static where year between 2016 and 2019 group by school_id;
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;

輸出的結(jié)果為一個(gè)json,展示了該sql在mysql內(nèi)部的sql優(yōu)化過程、索引選擇過程的執(zhí)行計(jì)劃。

重點(diǎn)關(guān)注執(zhí)行計(jì)劃的json中range_analysis下的內(nèi)容,這里展示了where范圍查詢過程中索引選擇。table_scan表示全表掃描,預(yù)估需要掃描1973546條記錄,但是由于全表掃描走聚集索引是順序IO讀,因此每條記錄的查詢成本很小,最終計(jì)算出來的查詢成本為399741。range_scan_alternatives表示使用索引的范圍查詢,year_school_key索引預(yù)估需要掃描812174條記錄,但是由于需要回表操作導(dǎo)致隨機(jī)IO讀,最終計(jì)算出來的查詢成本為974610。所以對(duì)于where查詢過程最終選擇全表掃描不走索引。

"range_analysis": {
  "table_scan": {
	"rows": 1973546,
	"cost": 399741
  },
  "potential_range_indices": [
	{
	  "index": "PRIMARY",
	  "usable": false,
	  "cause": "not_applicable"
	},
	{
	  "index": "school_id_key",
	  "usable": true,
	  "key_parts": [
		"school_id",
		"id"
	  ]
	},
	{
	  "index": "year_school_key",
	  "usable": true,
	  "key_parts": [
		"year",
		"school_id",
		"id"
	  ]
	}
  ],
  "setup_range_conditions": [
  ],
  "group_index_range": {
	"chosen": false,
	"cause": "not_applicable_aggregate_function"
  },
  "analyzing_range_alternatives": {
	"range_scan_alternatives": [
	  {
		"index": "year_school_key",
		"ranges": [
		  "2016 = year = 2019"
		],
		"index_dives_for_eq_ranges": true,
		"rowid_ordered": false,
		"using_mrr": false,
		"index_only": false,
		"rows": 812174,
		"cost": 974610,
		"chosen": false,
		"cause": "cost"
	  }
	],
	"analyzing_roworder_intersect": {
	  "usable": false,
	  "cause": "too_few_roworder_scans"
	}
  }
}

這里的查詢成本cost值完全可以手算出來,cost=I/O成本(每一次讀取記錄頁一次成本,每次成本為1.0)+CPU成本(每一條記錄一次成本,每次成本為0.2)。

全表掃描查詢成本

table_scan全表掃描時(shí)預(yù)估需要掃描1973546條記錄,通過show table status like "salary_static"命令可得全表記錄為82411520字節(jié)(Data_length),innodb每個(gè)記錄頁為16KB即全表掃描需要讀取82411520/1024/16 = 5030個(gè)記錄頁。

  • I/O成本
5030 * 1.0 = 5030
  • CPU成本
1973546 * 0.2 = 394709.2
  • 合計(jì)查詢成本
5030 + 394709.2 = 399739.2

索引查詢成本

year_school_key索引時(shí)預(yù)估需要掃描812174條記錄,且使用該索引需要先通過索引查詢到rowId,然后通過rowId回表。mysql認(rèn)為每次回表均需要一次單獨(dú)的I/O成本

  • CPU成本
812174 * 0.2 = 162434.8
  • I/O成本
812174 * 1.0 = 812174
  • 合計(jì)查詢成本
162434.8 + 812174 = 974608.8

接著再關(guān)注reconsidering_access_paths_for_index_ordering,表示最終對(duì)排序再進(jìn)行一次索引選擇優(yōu)化。這里選擇了school_id_key索引并且一票否決了上面where條件選擇的全表掃描:"plan_changed": true,詳見group-by-optimization。

{
    "reconsidering_access_paths_for_index_ordering": {
      "clause": "GROUP BY",
      "index_order_summary": {
        "table": "`salary_static`",
        "index_provides_order": true,
        "order_direction": "asc",
        "index": "school_id_key",
        "plan_changed": true,
        "access_type": "index_scan"
      }
    }
}

事實(shí)上排序索引優(yōu)化也存在bug,詳見Bug#93845。

優(yōu)化

通過分析sql執(zhí)行過程,可以發(fā)現(xiàn)選擇索引錯(cuò)誤的是因?yàn)閥ear_school_key索引回表記錄太多導(dǎo)致預(yù)估查詢成本大于全表掃描最終選擇了錯(cuò)誤的索引。

因此減少該sql的執(zhí)行時(shí)間,下一步的優(yōu)化方案是減少該sql的回表操作,即讓該sql進(jìn)行索引覆蓋。該sql涉及到的字段只有school_id、salary和year這3個(gè)字段,因此創(chuàng)建這3個(gè)索引的聯(lián)合索引,并注意這3個(gè)字段在聯(lián)合索引中的順序:where過濾語句最先執(zhí)行,所以year字段在聯(lián)合索引第一位;group by語句本質(zhì)上和order by一樣,因此排在where后面即聯(lián)合索引第二位;salary僅僅為了減少回表因此放在聯(lián)合索引末位。

CREATE INDEX year_school_salary_key ON salary_static (year, school_id, salary);

在創(chuàng)建了聯(lián)合索引后,再執(zhí)行sql語句后效果如下,僅花費(fèi)了0.2秒完成查詢,比起school_id_key索引的時(shí)間減少了35倍。

回表率計(jì)算

上述問題為sql一次性查詢數(shù)量太多,導(dǎo)致回表代價(jià)太大。事實(shí)上,上述現(xiàn)象的臨界值完全可以計(jì)算出來:

假設(shè)一行記錄的大小為a字節(jié),表的記錄數(shù)量為b,臨界記錄數(shù)量為c,則該表的記錄頁數(shù)量為b*a/1024/16

全表掃描的查詢成本 = I/O成本 + CPU成本
= b*a/1024/16 * 1.0 + b * 0.2


索引掃描的查詢成本 = I/O成本 + CPU成本
= c * 1.0 + c * 0.2 = c * 1.2


b*a/1024/16 * 1.0 + b * 0.2 = c * 1.2
臨界比例 = c/b 
= (a/1024/16 + 0.2)/1.2
= a * 5E-5 + 0.1667

即當(dāng)一條sql查詢超過表中超過大概17%的記錄且不能使用覆蓋索引時(shí),會(huì)出現(xiàn)索引的回表代價(jià)太大而選擇全表掃描的現(xiàn)象。且這個(gè)比例隨著單行記錄的字節(jié)大小的增加而略微增大。

到此這篇關(guān)于mysql回表致索引失效案例講解的文章就介紹到這了,更多相關(guān)mysql回表致索引失效內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決mysql模糊查詢索引失效問題的幾種方法
  • MySQL索引失效的典型案例
  • mysql索引失效的幾種情況分析
  • MySQL索引失效的幾種情況詳析
  • MySQL索引失效的幾種情況匯總
  • mysql索引失效的五種情況分析
  • Mysql索引會(huì)失效的幾種情況分析
  • mysql索引失效的十大問題小結(jié)

標(biāo)簽:揚(yáng)州 阿里 溫州 無錫 定西 三明 山西 福州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《mysql回表致索引失效案例講解》,本文關(guān)鍵詞  mysql,回表,致,索引,失效,;如發(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回表致索引失效案例講解》相關(guān)的同類信息!
  • 本頁收集關(guān)于mysql回表致索引失效案例講解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产精一区二区| 亚洲精品在线电影| 亚洲第一黄色网| 亚洲欧美第一页| 国产精品久久久久久户外露出| 国产日韩欧美一区二区三区乱码| 国产又大又黄又粗的视频| 97影院秋霞午夜在线观看| 久久老女人爱爱| 欧洲激情一区二区| 美女少妇精品视频| 日本欧美精品久久久| 蜜桃视频一区二区三区在线观看| 在线观看一区二区三区三州| 天天综合一区| 国产精品护士白丝一区av| 2色视频网站| 一区二区三区电影网| 狠狠色狠狠色综合日日tαg| 蜜桃传媒一区二区三区| 国产欧美日韩激情| 国产亚洲欧美日韩日本| 日本精品免费视频| 久久国产亚洲精品| 91麻豆精品一区二区三区| 亚洲欧美日韩综合aⅴ视频| 欧美成人影院| 久久精品人成| 激情五月亚洲色图| 欧美在线影院在线视频| 国产精品久久中文| 国产清纯白嫩初高中在线观看性色| 在线激情小视频| 国产中文字字幕乱码无限| 偷窥国产亚洲免费视频| 天天综合视频在线观看| 麻豆精品免费视频| 成人h动漫精品一区二| 欧美无乱码久久久免费午夜一区| 日本精品视频网站| 一区二区三区精品久久久| 亚洲网站一区| 国产女人伦码一区二区三区不卡| 欧美 变态 另类 人妖| 在线一区视频观看| 欧美 国产 精品| 国产成人精品亚洲男人的天堂| 日韩欧美一区二区三区| 激情亚洲一区二区三区四区| 国产嫩草在线视频| 欧美黄网站色视频| 久久一二三国产| 久久久久香蕉视频| 日本一区二区视频在线| 网曝门事件国产精品二区| 在线免费观看亚洲| 日本网址在线观看| 欧美日韩精品免费观看视频| 国产不卡一区| 欧美成人日本| 亚洲va欧美va天堂v国产综合| 99热这里只有精品99| 天天曰天天操| 免费看成人人体视频| 国产精品白嫩初高中害羞小美女| 欧美精品一区二区在线观看| av福利在线观看| 国产精品一区二区性色av| 91网站在线观看视频| 国产厕所精品在线观看| 国产一区二区三区奇米久涩| 国产高清视频免费在线观看| 国产精品久线在线观看| caoporn成人免费视频在线| 青青艹在线观看| 国产欧美日韩另类视频免费观看| 懂色av一区二区三区免费观看| 国产午夜精品福利| 日本精品视频在线| 哺乳挤奶一区二区三区免费看| 少妇久久久久久被弄高潮| 菠萝蜜网站在线观看| 色狠狠一区二区| k8久久久一区二区三区| 性欧美疯狂xxxxbbbb| 女主播福利一区| 欧洲亚洲精品久久久久| 亚洲毛片aa| 美女被男人操网站| 亚洲色图15p| 四虎影视网站| 欧美sm极限捆绑bd| 久久黄色一级视频| 欧美精品激情在线| 91福利精品在线观看| 欧美特黄一级| 男女啪啪a级毛片| 毛片视频免费观看| 国产精品一卡二| 欧美精品一区二区三区中文字幕| 久草免费在线观看视频| 人妻无码一区二区三区四区| 欧美国产日产图区| 无码人妻久久一区二区三区不卡| 天天色天天干天天色| 国产三级小视频| 国产在线观看你懂的| 国产91精品网站| 视频在线观看一区二区| 国产一区二区三区奇米久涩| 欧美一级黄色网| 91精品国产aⅴ一区二区| 久久午夜鲁丝片午夜精品| 污视频在线免费观看网站| 天堂精品中文字幕在线| 国产真实乱偷精品视频| 极品颜值美女露脸啪啪| 国产午夜精品久久| 国产成人免费91av在线| 国产对白叫床清晰在线播放| 亚洲成人偷拍自拍| 日韩一区中文字幕| 99久久精品日本一区二区免费| 日韩欧美在线第一页| 久草电影在线| 国产成人天天5g影院在线观看| 免费福利在线视频| 国产不卡av在线| 久久综合亚洲社区| 亚洲第一综合网| 国产一级二级视频| 激情成人开心网| 浮力影院网站午夜| 精品樱空桃一区二区三区| 中文字幕日韩一区二区三区| 日本一区二区在线看| 亚洲一区中文| 影音先锋中文资源站| 欧美久久久久中文字幕| 女人高潮被爽到呻吟在线观看| 国产大尺度视频| 国产精品成人免费| 国产最新精品视频| 都市激情亚洲色图| 91精品国产91久久久久久黑人| av在线这里只有精品| 天堂视频在线免费观看| sqte在线播放| 国产色噜噜噜91在线精品| 亚洲影院色在线观看免费| 在线观看国产精品91| 99久久这里有精品| 欧美少妇一区| 日本加勒比高清在线| ijzzijzzij亚洲大全| 国产精品黄色网| 午夜亚洲性色视频| 日韩精品一级二级| 二区视频在线| 在线成人高清不卡| 国产av一区二区三区精品| 成人网av.com/| 亚洲av无码国产精品永久一区| 欧美在线3区| 717成人午夜免费福利电影| 四虎视频在线精品免费网址| av不卡在线免费观看| 自拍偷拍欧美精品| 成人精品国产免费网站| 精品久久久久久乱码天堂| 国产51人人成人人人人爽色哟哟| 97精品国产99久久久久久免费| 91免费国产在线观看| 亚洲欧美日韩网站| 亚洲经典中文字幕| 亚洲毛片在线播放| 成人黄色一级大片| 精品激情国产视频| 日韩欧美视频| 日韩人妻无码一区二区三区99| 国产日韩欧美高清在线| 久久精品美女视频| 国产精品入口免费视| 国产精品久久久久福利| 欧美插天视频在线播放| 精品国产无码一区二区三区| 中国1级黄色片| 国产人成高清视频观看| 欧美资源一区| 亚洲天堂在线视频观看| 91av视频在线免费观看| 亚洲婷婷免费| 国产 日韩 欧美 在线| 成人免费看片'免费看| 农村一级毛片| 日本一级淫片免费放| gogo高清免费视频| 天堂在线视频播放| 一区二区高清免费观看影视大全| 午夜精品福利影院| 中文字幕久精品免| 在线丨暗呦小u女国产精品| 欧美大陆一区二区| 最近2019年中文视频免费在线观看| 亚洲午夜久久久久中文字幕久| 黄色毛片免费看| 欧美黑人性猛交| 韩国专线一区二三区| 亚洲一区二区三区在线视频| 成人在线免费看| 97在线观看免费| 国产精品丝袜一区| 欧洲grand老妇人| 亚洲男人的天堂网站| 国产精品久久久久久久久久免费| 精品夜夜澡人妻无码av| 亚洲校园激情春色| 亚洲白虎美女被爆操| av电影免费看| 欧美久久香蕉| 狠狠操狠狠色| 日韩在线资源网| 先锋影音日韩| 亚洲日本视频在线观看| 手机在线免费毛片| 亚洲综合最新在线| 黄动漫视频高清在线| 国产日韩在线播放| 美女脱光内衣内裤| 91精品中文字幕| 蜜桃视频中文字幕| 亚洲精品成人av| 中国动漫在线观看完整版免费| 中文字幕一区二区三区域| 日韩视频永久免费| a级片免费在线观看| 亚洲高清视频一区| 丁香花高清视频完整版在线观看| 拔插拔插海外华人免费| 欧美成人免费在线视频| 欧美在线一区二区三区四区| 久久精品欧美视频| 成年人视频在线免费看| eeuss影院在线观看第一页| 牛牛视频精品一区二区不卡| 日本午夜视频| 一区二区三区不卡视频在线观看| 日韩在线免费电影| 91福利资源站| 一级欧美视频| 久久视频免费观看| 欧美国产精品久久| 亚洲香蕉av在线一区二区三区| 国产精品一区二区三区免费观看| 亚洲自拍电影| 91成人国产综合久久精品| 欧美裸体在线版观看完整版| 原纱央莉成人av片| 色偷偷亚洲第一成人综合网址| 韩国成人av| 制服国产精品| www红色一片_亚洲成a人片在线观看_| 亚洲图片欧美在线| 亚洲91中文字幕无线码三区| 亚洲影视中文字幕| 中文字幕日韩在线观看| 亚洲福利视频导航| 中国日本在线视频中文字幕| av日韩中文字幕| 一级黄色性视频| 国产人与zoxxxx另类91| 蜜桃视频一区二区三区| 国产成人一二三区| 国产噜噜噜噜噜久久久久久久久| 黑丝美女一区二区| 在线视频se| 精品一区二区三区中文字幕视频| 在线视频一区二区| 椎名由奈jux491在线播放| 羞羞网站在线免费观看| 日韩久久一区二区| 日韩成人免费观看| 天堂社区在线视频| 野外做受又硬又粗又大视频√| caoporn97在线视频| 国产日韩在线播放| 在线观看视频亚洲| 久操成人av| 国产欧美精品日韩精品| 日本三级一区二区| 91入口在线观看| 国产亚洲第一页| 日韩一区和二区| 亚洲国产精品无码久久| 成人免费在线一区二区三区| 亚洲欧美制服丝袜| 亚洲乱码精品久久久久..| 天堂久久午夜av| 久久精品国产一区二区三区日韩| 亚洲熟妇av乱码在线观看| 亚洲制服丝袜一区| 99re在线视频这里只有精品| 全部a∨一极品视觉盛宴| 日本不卡在线观看视频| 欧美五码在线| 国产精品美女久久久久久2018| 欧美国产丝袜视频| 波多野结衣在线| 久久国产精品99国产精| 尤物yw午夜国产精品视频| 欧美www在线观看| 一本久道久久综合狠狠爱亚洲精品| 国产成人午夜精品5599| 91精品久久久久久久| √天堂8资源中文在线| 久久亚洲春色中文字幕久久久| 在线视频91p| 国产福利在线播放| 中文字幕视频在线免费欧美日韩综合在线看| 中文字幕乱在线伦视频乱在线伦视频| 亚洲激情图片网| 亚洲欧美一区二区三区四区| 国产97免费视| 国产成人免费在线观看| 日韩精品国产一区二区| 欧美一区二区三区爽爽爽| 久久久噜噜噜| 九九免费视频|