資源描述:
《MySQL查詢優(yōu)化淺析(2013-02-22更新版).pdf》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。
1、MySQL查詢優(yōu)化淺析網(wǎng)易杭研-何登成個(gè)人簡(jiǎn)介?姓名:何登成?工作:–就職于網(wǎng)易杭州研究院,進(jìn)行自主研發(fā)的TNT存儲(chǔ)引擎的架構(gòu)設(shè)計(jì)/研發(fā)工作?聯(lián)系方式–郵箱:he.dengcheng@gmail.com–微博:何_登成–主頁:http://hedengcheng.com/何為查詢優(yōu)化??目標(biāo)–給定一個(gè)SQL,查找SQL最優(yōu)(局部最優(yōu))的執(zhí)行路徑,使得用戶能夠更快的得到SQL執(zhí)行的結(jié)果?指標(biāo)–代價(jià)模型;–SQL的每一種執(zhí)行路徑,均可計(jì)算一個(gè)對(duì)應(yīng)的執(zhí)行代價(jià),代價(jià)越小,執(zhí)行效率越高;反之則反之;大綱?MySQL
2、Optimizer流程?MySQLRangeOptimizer(分享重點(diǎn))–Cost模型–統(tǒng)計(jì)信息?MySQLServer層統(tǒng)計(jì)信息?InnoDB層統(tǒng)計(jì)信息?統(tǒng)計(jì)信息持久化?動(dòng)態(tài)收集統(tǒng)計(jì)信息?統(tǒng)計(jì)信息收集策略–RangeQueryExamples?MySQLJoinOptimizer?MySQLOptimizerEnhancement總流程MySQLRangeOptimizer?RangeOptimizer有哪些問題–全表掃描or索引掃描選擇?–全表掃描的代價(jià)如何計(jì)算?–聚簇索引Range查詢代價(jià)如何計(jì)算
3、?–二級(jí)索引Range查詢代價(jià)如何計(jì)算?–索引覆蓋掃描vs索引非覆蓋掃描?–表級(jí)統(tǒng)計(jì)信息有哪些?–統(tǒng)計(jì)信息在Range查詢優(yōu)化中何用?–統(tǒng)計(jì)信息何時(shí)收集?收集算法?RangeQuery-代價(jià)模型?總代價(jià)模型–COST=CPUCost+IOCost?CPUCost–MySQL上層,處理返回記錄所花開銷–CPUCost=records/TIME_FOR_COMPARE=records/5–每5條記錄的處理時(shí)間,作為1Cost?IOCost–存儲(chǔ)引擎層面,讀取頁面的IO開銷。–以下InnoDB為例?聚簇索引?二
4、級(jí)索引RangeQuery-聚簇索引?聚簇索引(IOCost)–全掃描?IOCost=table->stat_clustered_index_size?聚簇索引頁面總數(shù)?一個(gè)頁面作為1Cost–范圍掃描?IOCost=[(ranges+rows)/total_rows]*全掃描IOCost?聚簇索引范圍掃描與返回的記錄成比率。RangeQuery-二級(jí)索引?二級(jí)索引(IOCost)–索引覆蓋掃描?索引覆蓋掃描,減少了返回聚簇索引的IO代價(jià)–keys_per_block=(stats_block_size/
5、2)/(key_info[keynr].key_length+ref_length+1)–stats_block_size/2?索引頁半滿?IOCost–(records+keys_per_block-1)/keys_per_block?計(jì)算range占用多少個(gè)二級(jí)索引頁面,既為索引覆蓋掃描的IOCostRangeQuery-二級(jí)索引?二級(jí)索引(IOCost續(xù))–索引非覆蓋掃描?索引非覆蓋掃描,需要回聚簇索引讀取完整記錄,增加IO代價(jià)?IOCost=(ranges+rows)?ranges:多少個(gè)范圍。–
6、對(duì)于IN查詢,就會(huì)轉(zhuǎn)換為多個(gè)索引范圍查詢?rows:為范圍中一共有多少記錄。–由于每一條記錄都需要返回聚簇索引,因此每一條記錄都會(huì)產(chǎn)生1costCost模型分析?聚簇索引掃描代價(jià)為索引頁面總數(shù)量?二級(jí)索引覆蓋掃描代價(jià)較小?二級(jí)索引非覆蓋掃描,代價(jià)巨大–未考慮類似于Oracle中的聚簇因子(Clusterfactor)影響??Cost模型的計(jì)算,需要統(tǒng)計(jì)信息的支持–stat_clustered_index_size–ranges–records/rows–stats_block_size–key_info[
7、keynr].key_length–rec_per_key–...統(tǒng)計(jì)信息?MySQLServer層的統(tǒng)計(jì)信息–ha_statistics?引擎負(fù)責(zé)設(shè)置–CONST–VARIABLE?InnoDB層的統(tǒng)計(jì)信息–dict_table_struct?語句級(jí)統(tǒng)計(jì)信息–每個(gè)查詢語句,指定不同的Range?不同的Range,包含的records數(shù)量不同?同一Range,不同的索引,包含的records數(shù)量不同–records_in_rangeMySQLServer層統(tǒng)計(jì)信息?CONST統(tǒng)計(jì)信息–此類統(tǒng)計(jì)信息,在表創(chuàng)
8、建之后,就基本維持不變,類似于常量(非完全不變)?種類–max_data_file_length、data_file_name、block_size...不變–block_size?計(jì)算索引覆蓋掃描Cost所需,頁面大小–rec_per_key...會(huì)變化?標(biāo)識(shí)一個(gè)索引鍵(包括前綴鍵值)相同相同取值的平均個(gè)數(shù)?算法:rec_per_key=total_rows/key_distinct_count?此參數(shù),是MySQL進(jìn)行Jo