Forpersonaluseonlyinstudyandresearch;mercialuseMysqlInnodb查询优化实现分析以下文字由808影视于影视网何登成目录1 目的 22 测试准备 23 单表查询 单表range查询 records_in_range函数分析 ess_path函数(单表) 单表range查询总结 单表unique查询 单表Unique查询总结 94 多表查询 多表简单join ess_path函数分析 总流程分析 代价估计分析 ess_path函数流程 optimizer_search_depth参数 多表join查询总结 155 统计信息 统计信息收集 统计信息更新 统计信息收集总结 186 查询优化总结 187 参考文献 18附录一 19附录二 20附录三 21附录四 22目的分析mysql+innodb如何实现查询优化?实现查询优化,存储引擎需要做哪些方面的配合?测试准备mysql selectversion(); -debug-loginnodb--------表定义---------+-------+------------------------------|Table|CreateTable+-------+------------------------------|nkeys|CREATETABLE`nkeys`(`c1`int(11)NOTNULL,`c2`int(11)DEFAULTNULL,`c3`int(11)DEFAULTNULL,`c4`int(11)DEFAULTNULL,`c5`int(11)DEFAULTNULL,PRIMARYKEY(`c1`),UNIQUEKEY`c2`(`c2`),UNIQUEKEY`c3`(`c3`),UNIQUEKEY`c4`(`c4`),KEY`nkey1`(`c3`,`c5`))ENGINE=InnoDBDEFAULTCHARSET=gbk|+-------+----------------------------------数据----insertintonkeysvalues(1,1,1,1,1);insertintonkeysvalues(2,2,2,2,2);insertintonkeysvalues(3,3,3,3,3);insertintonkeysvalues(4,4,4,4,4);insertintonkeysvalues(5,5,5,5,5);单表查询单表range查询select*fromnkeyswherec3>3; 不能进行索引覆盖扫描 indexrangescanselectc3fromnkeyswherec3>3;可以进行索引覆盖扫描 indexonlyrangescan调用流程:msyql_select->JOIN::optimize->make_join_statistics->::get_quick_record_count->::SQL_SELECT::test_quick_select–>ha_innobase::scan_time->get_key_scans_params->check_quick_select–>::check_quick_keys->ha_innobase::records_in_range->get_index_only_read_time->ha_innobase::read_time->get_best_ror_intersect->get_best_covering_ror_intersect->ha_innobase::scan_time函数,给出全表扫描read_timescan_time=(double)records/PARE+1;mysql层面,返回一个record需要的时间(CPU时间)PARE=5return(double)(prebuilt->table->stat_clustered_index_size(聚簇索引叶页面数);innodb层面,全表扫描时间,用读取的page数计算(IO时间)由于innodb是索引组织表,用不到page的预读,因此一次读取一个pagetable_read_time=ha_innobase::scan_time()+scan_time+1;全表扫描总时间=innodb读取数据块时间+mysql比较记录时间+1测试中:table_read_time=,判断索
Mysql Innodb 查询优化实现分析专业版 来自淘豆网www.taodocs.com转载请标明出处.