MySQL源码 优化器

完成了sql的解析过程后,开始进入优化器:

调用的流程分为:

mysql_select:

JOIN::prepare:

JOIN::optimize:

JOIN::exec:

prepare过程:

组装各个组件,包括:stepup tables, fields, condition, order

1. tables:

setup_tables_and_check_access:从table_list中检查访问权限,并加入到leaf_tables中,增加tables计数。

setup_tables&&check_single_table_access

2. setup_fields
       
  setup_wild:如果使用了*,这个地方要解开成字段。

find_field_in_tables:查找字段是否存在表中

把item生成成field。

3. setup_without_group

setup_conds:处理where条件,检索conds中的字段

setup_order:处理order子句,检索order中的字段

setup_group:处理group子句,检索group中的字段

optimize过程:

1. simplify_joins:所有的外连接更改为内连接。

2. build_bitmap_for_nested_joins:为嵌套的join查询建立一个bitmap。

3. optimize_cond:优化where条件

remove_eq_conds:删除等价的条件

4. prune_partitions:分区修剪,这里只是分区表的处理,非分区表不做处理

5. make_join_statistics:

table->file->stats.records;检索引擎上对表的统计信息,

table->s->keys:获取table_share对象上这个表的所有key。

update_ref_and_keys:获取索引信息

choose_plan:

                   
optimize_straight_join:

                   
find_best:

                   
greedy_search:

exec的过程:

1. do_select:分解join

2. sub_select: Retrieve records

3. evaluate_join_record:

下一篇开始进行一些实验:

MySQL源码 优化器,布布扣,bubuko.com

时间: 2024-10-12 14:47:10

MySQL源码 优化器的相关文章

MySQL源码 解析器

sql请求发送到server端,需要经过解析器生成内部的数据结构对象,以方便进行优化和生成执行计划.解析器主要做了两件事情,词法分析和语法分析. 词法和语法分析:mysql使用lex词法分析器,yacc语法分析器进行分析,最后保存到lex对象结构中. 例如:     select id, name from xpchild where id=1 1. 在mysql_parse函数中使用lex_start初始化thd->lex对象,然后调用yacc中的MYSQLparse函数进行词法和语法分析.

Linux(CentOS或RadHat)下MySQL源码安装

安装环境: CentOS6.3 64位 软件: Mysql-5.6 所需包: gcc/g++ :MySQL 5.6开始,需要使用g++进行编译.cmake  :MySQL 5.5开始,使用cmake进行工程管理,cmake需要2.8以上版本.bison  :MySQL语法解析器需要使用bison进行编译.ncurses-devel :用于终端操作的开发包.zlib    :MySQL使用zlib进行压缩 有关库包下载: 可以自己去官网下载,也可以去网盘下载 http://pan.baidu.co

MySQL源码编译安装(CentOS-6.6+MySQL-5.6)

MySQL源码编译安装(CentOS-6.6+MySQL-5.6) 部署环境 操作系统:CentOS-6.6-x86_64-bin-DVD1.iso MySQL版本:mysql-5.6.26.tar.gz 操作用户:root 系统IP:192.168.1.205 主机名:edu-mysql-01 配置:4核.4G内存 一.服务器配置: 1.配置网络 # vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 BOOTPROTO=stati

Mysql源码目录结构

Programs for handling SQL commands. The "core" of MySQL. These are the .c and .cc files in the sql directory: derror.cc --- read language-dependent message file des_key_file.cc --- load DES keys from plaintext file discover.cc --- Functions for

maridb\mysql 源码安装,以10.1.26版本为例

mysql 源码安装(mariadb 10.1.26) 1.环境部署 1 安装cmake 源码安装三部曲或者yum install cmake 2安装依赖包yum install -y ncurses-devel openssl-devel openssl gcc gcc-c++ readline-devel zlib-devel libaio-devel libxml2-devel libcurl-devel libarchive-devel boost boost-develyum grou

MySQL源码编译安装

1.安装cmake-2.8.10.2.tar.gz 以root用户进入shell #tar -zxvf  cmake-2.8.10.2.tar.gz #cd cmake-2.8.10.2 #./configure #make                         (无法make,检测gcc编译环境) #make install --------------------------------- 2.安装ncurses-5.9.tar.gz #tar -zxvf  ncurses-5.9

在win7 下编译MySQL源码

MySQL MySQL是一款优秀的开源数据库,在阿里.网易等各个互联网公司中有着广泛的应用.尽管各种NoSQL大行其道,但是关系型数据库依然必不可少. 作为一个新手,在Win7下用源码安装MySql数据库并不容易.我自己都折腾了好几天.今天把安装过程记录下来,其一是为了方便自己以后学习,其二则是分享过程,让学习者能够从我这篇文章中受益. 1. 编译环境及源码下载 编译环境:Visual Studio 2010 (Win7 32位) 编译工具: bison-2.4.1-setup.exe 下载地址

MySQL源码之两阶段提交

在双1的情况下,两阶段提交的过程 环境准备:mysql 5.5.18, innodb 1.1 version配置: sync_binlog=1 innodb_flush_log_at_trx_commit=1 autocommit=0 设置断点: sql_parse.cc::dispatch_command --命令跳转入口 sql_parse.cc::mysql_parse sql_parse.cc::mysql_execute_command sql_parse.cc::trans_comm

MySQL源码之mysqld启动

启动mysqld,并进入listen阶段 函数调用栈: mysqld_main(): my_init();初始化变量,锁,错误串 my_thread_global_init(): 初始化互斥锁,信号量,线程独享变量 load_defaults();查找my.cnf sys_var_init();初始化system variables init_common_variables:初始化mutex,status变量 init_signals:初始化信号量处理 init_server_componen