目录

  • 1. 版本关系
  • 2. MySQL MariaDB 安装
    • 2.1. MariaDB安装

      • 2.1.1. 源码编译安装
    • 2.2. docker运行
    • 2.3. 安装MySQL
  • 3. 文件目录 & 类 概述
    • 3.1. 文件

      • 3.1.1. 头文件
    • 3.2. 类
  • 4. MySQL语句解析器 – lex + yacc
    • 4.1. 概述
    • 4.2. Lex 词法解析器
    • 4.3. yacc 语法解析器
  • 5. MySQL语句 成员分析
    • 5.1. 语句解析过程
    • 5.2. select 语句
      • 5.2.1. select 语句中子查询处理逻辑的分析

1. 版本关系

  1. MariaDB与MySQL的版本对应关系

参考:

  1. mysql&mariadb–Compatibility & Differences

2. MySQL MariaDB 安装

2.1. MariaDB安装

2.1.1. 源码编译安装

使用源码编译后进行安装;

参考:

  1. CentOS7安装MariaDB 10.5.4
  2. centos7 mariadb 10.5.5 源码自动化安装 shell

2.2. docker运行

  1. 安装高版本MariaDB

    1. 配置MariaDB的yum源设置;
    2. 使用yum进行安装或升级;
  2. mariadb设置登录密码:

    MariaDB [(none)]> USE mysql;
    MariaDB [(none)]> UPDATE user SET password=PASSWORD('YourPasswordHere')WHERE User='root' AND Host = 'localhost';
    MariaDB [(none)]> FLUSH PRIVILEGES;
    

参考:
    1. centos7.5下yum 安装mariadb10.3详解


2.3. 安装MySQL

  • 问题:

    1. mysql 数据持久化问题

      # 获取镜像docker search mysqldocker pull centos/mysql-57-centos7:5.7# 运行容器, 需要做数据挂载  //安装启动mysql,需要配置密码;## 官方命令docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag## 实践docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7## 连接mysql -uroot -p'123456' -P3310 -h192.168.0.120
      

参考:

  1. docker-mysql官网

3. 文件目录 & 类 概述

3.1. 文件

参考:

  1. MySQL是怎么在源码层表达对象的-----Item对象及子对象解析(一)
  2. MySQL源码分析以及目录结构    //重要;

3.1.1. 头文件

  1. item.h:
    总的对象定义类,定义了’Item’类作为总的对象类,此后,本文件中定义了许多子类,来丰富和发展MySQL可以处理的对象。但此类继承自’Parse_tree_node’类,使得对象和词法语法解析关联起来,这个不细述。

  2. item_cmpfunc.h:
    定义了’Item_bool_func’类,继承自’Item_int_func’类,而Item_int_func继承自Item_func,Item_func类继承自Item类。'Item_bool_func’类主要用于支持比较操作,如等于、大于、小于、IN、BETWEEN、是否为NULL等。

  3. item_create.h:
    用户自定义函数的创建接口。

  4. item_func.h:
    定义了 Item_func类,继承自Item类,用以支持各种函数操作。如求绝对值、求长度、取余等等。本文件中也定义了许多子类,来丰富和发展MySQL可以处理的对象。

  5. item_geofunc.h:
    空间对象处理相关函数。

  6. item_inetfunc.h:
    定义IPv4、IP6的处理。

  7. item_sum.h:
    定义聚集函数的处理。包括MIN和MAX,但通常这2函数个是利用索引进行优化的。

3.2. 类


4. MySQL语句解析器 – lex + yacc

4.1. 概述

  1. 解析过程

  2. 解析器:

    1. mysql是使用了开始的bison(即yacc的开源版)作为sql语法解析器;
    2. 在mysql源码中,解析sql在sql_yacc.yy中实现,而sql_yacc.yy 借助 bison 来转换为c文件。
  3. SQL解析相关文件及关联

    1. SQL词法解析文件:
      sql/sql_lex.h、sql/lex_token.h、sql/lex.h、sql/lex_symbol.h
      sql/gen_lex_token.cc、sql/sql_lex.cc

    2. SQL语法解析文件:
      sql/sql_yacc.yy、sql/sql_yacc.cc、sql/sql_yacc.h

    3. SQL语句的hint语法解析文件:
      sql/sql_hints.yy、sql/sql_hints.yy.cc


4.2. Lex 词法解析器


4.3. yacc 语法解析器

yacc
bison

参考:

  1. MySQL内核源码解读-SQL解析一  //Bison
  2. 从Mysql源代码角度分析一句简单sql的查询过程 //重要

5. MySQL语句 成员分析

5.1. 语句解析过程

参考:

  1. 用mysql源码进行SQL解析

下文只对常用的select(SQLCOM_SELECT), update(SQLCOM_UPDATE), insert(SQLCOM_INSERT), delete(SQLCOM_DELETE)做一下介绍。

  • 5.1 Select语句
    对select类型的语句解析后,将结果存放在SELECT_LEX类中
    其中:
    选择域存放在SELECT_LEX::item_list中,类型为LIST
    where域存放在SELECT_LEX::wheret中,类型为Item*
    having域存放在SELECT_LEX::having中,类型为Item*
    order域存放在SELECT_LEX::order_list中,实际类型为ORDER*
    group域存放在SELECT_LEX::group_list中,实际类型为ORDER*
    limit域存放在SELECT_LEX::select_limit中,unsigned long
    table名字域存放在SELECT_LEX::table_list中,实际类型为TABLE_LIST*
    (其中选择域的结构请见上文中的4(1),where域和having域的解构请见上文中的4(2), 其他几个域的解构类似于链表)

  • 5.2 Update语句
    对update类型的语句解析后,将结果存放在SELECT_LEX类和LEX类中
    其中:
    更新域存放在SELECT_LEX::item_list中,类型为LIST
    值域存放在LEX::value_list中,类型为LIST
    where域存放在SELECT_LEX::wheret中,类型为Item*
    table名字域存放在SELECT_LEX::table_list中,实际类型为TABLE_LIST*
    (其中更新域和值域的结构请见上文中的4(1),where域的解构请见上文中的4(2), table名字域的解构类似于链表)

  • 5.3 Insert语句
    对insert类型的语句解析后,将结果存放在SELECT_LEX类和LEX类中
    其中:
    插入域存放在LEX::item_list中,类型为LIST
    值域存放在LEX::many_values中,类型为LIST<LIST>
    table名字域存放在SELECT_LEX::table_list中,实际类型为TABLE_LIST*
    (其中插入域的结构请见上文中的4(1), 值域可以含有多个LIST, table名字域的解构类似于链表)

  • 5.4 Delete语句
    对delete类型的语句解析后,将结果存放在SELECT_LEX类中
    其中:
    where域存放在SELECT_LEX::wheret中,类型为Item*
    limit域存放在SELECT_LEX::select_limit中,unsigned long
    table名字域存放在SELECT_LEX::table_list中,实际类型为TABLE_LIST*
    (其中选择域的结构请见上文中的4(1),where域和having域的解构请见上文中的4(2), 其他几个域的解构类似于链表)


5.2. select 语句

参考:

  1. MySQL解析器源码分析–对select语句中子查询处理逻辑的分析(一)

5.2.1. select 语句中子查询处理逻辑的分析

  1. 主要数据结构 & 相互关系

    1. select 结构

      • MySQL解析器中负责分析和存储一个select语句信息的数据结构是st_select_lex类(MySQL中同时将该类宏定义为 SELECT_LEX);
      • 同时负责分析和存储union关系的数据结构是st_select_lex_unit类(MySQL中同时将该类宏定义为SELECT_LEX_UNIT);
      • 而这两个类都继承于 st_select_lex_node类
    2. SELECT_LEX类

      1. 对于SELECT_LEX类,它主要是存储一个select语句中select子句的返回列信息,from子句中的表信息,order by,group by子句的列信息等。
      2. 对于本文所关心的问题,SELECT_LEX类使用继承于st_select_lex_node类的 next指针 存储和该select语句进行union操作的其他select语句对应的 SELECT_LEX的地址,通过该指针串成union链表;
  2. 具体存储方式

    1. 语句 & 存储结构

      //见:参考1
      # 语句(SELECT ...) UNION (SELECT ... (SELECT...)...(SELECT...UNION...SELECT))1           2      3           4             5        6       7
      # 数据结构------------------------------------------------------------------------level 1SELECT_LEX_UNIT(2)|+---------------+|(UNIT->slave)  |SELECT_LEX(1)   SELECT_LEX(3) ---SELECT_LEX(1)->next|--------------- | ------------------------------------------------------|                                                level 2+-------------------+|            |SELECT_LEX_UNIT(4)  SELECT_LEX_UNIT(6)|                   ||                   +--------------+|                   |              |SELECT_LEX(4)       SELECT_LEX(5)  SELECT_LEX(7)------------------------------------------------------------------------
      
    2. 解析:
      1. SELECT_LEX_UNIT 负责管理处于同一级的进行 union操作 的 数个select子句对应的SELECT_LEX
      2. 指针:
        1. SELECT_LEX_UNIT 通过继承于st_select_lex_node类 的 slave指针 存储属于这一级的进行union操作的 第一个SELECT_LEX
        2. 这一级别其他参与union操作的SELECT_LEX,可以通过 next指针 串成的链表依次找到。
      3. SELECT_LEX_UNIT类中的个成员变量 fake_select_lex,来保存整个union操作的order by,limit条件。
      4. 子查询(subselect)
        select子句,from子句,where子句中出现子查询(subselect)的情况:

        1. MySQL解析器会先建一个SELECT_LEX_UNIT,将此SELECT_LEX_UNIT挂在该子查询上一级select对应的SELECT_LEX下(即该SELECT_LEX的slave指针赋值为此SELECT_LEX_UNIT对应的地址);
        2. 同时新建一个SELECT_LEX和这个子查询对应,将这个新建的SELECT_LEX挂在刚建的SELECT_LEX_UNIT下。 ----level 2;

总的执行顺序:
FROM > ON > JOIN > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > UNION > ORDER BY > LIMIT

参考:

  1. MySQL Internals Manual:12.4 Structure Of Complex Select
  2. MySQL解析器源码分析–对select语句中子查询处理逻辑的分析(一)

【MySQL源码】01 MySQL源码总述相关推荐

  1. Spring5源码 - 01 BeanDefination源码分析

    文章目录 引入 Bean实例化的原理 singleton vs prototype Singleton VS Prototype 小结 下文 引入 Spring 是如何生成一个Bean的? 我们先看个 ...

  2. 深入解析:从源码窥探MySQL优化器

    关注我们,下载更多资源 作者 | 汤爱中,云和恩墨SQM开发者,Oracle/MySQL/DB2的SQL解析引擎.SQL审核与智能优化引擎的重要贡献者,产品广泛应用于金融.电信等行业客户中. 摘要 优 ...

  3. l源码安装mysql升级_[Linux]javaEE篇:源码安装mysql

    javaEE :源码安装mysql 安装环境 系统平台:CentOS-7-x86_64 数据库版本:mysql-5.6.14 源码安装mysql步骤: 一.卸载mysql 安装mysql之前,先确保l ...

  4. kylin安装mysql_源码安装mysql

    一.环境 CentOS7.4   64位  最小化安装 二.准备工作 1.安装依赖 yum -y install wget cmake gcc gcc-c++ ncurses ncurses-deve ...

  5. 《MySQL 8.0.22执行器源码分析(3.2)关于HashJoinIterator》

    在本文章之前,应该了解的概念: 连接的一些概念.NLJ.BNL.HashJoin算法. 目录 关于join连接 probe行保存概念 Hashjoin执行流程(十分重要) HashJoinIterat ...

  6. 计算机毕业设计Python+django的火车票售票系统(源码+系统+mysql数据库+Lw文档)

    项目介绍 随着现代火车售票管理的快速发展,可以说火车售票管理已经逐渐成为现代火车售票管理过程中最为重要的部分之一.但是一直以来我国传统的火车售票管理并没有建立一套完善的行之有效的火车售票管理系统,传统 ...

  7. liunx上mysql源码安装mysql,搞定linux上MySQL编程(一):linux上源码安装MySQL

    [版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 1. 首先下载源码包: ftp://ftp.jaist.ac.jp/pub/m ...

  8. 在Ubuntu上源码安装MySQL+安装问题解决+安全优化

    当然,MySQL的安装方法多种多样,在Ubuntu上,你可以采用apt-get的方式安装,这样的好处是:快速方便.基本上,它会帮你解决所有的函数库依赖问题,正常情况下,只要apt-get执行完成,那么 ...

  9. LNMP架构详解(2)——Mysql、PHP、Nginx源码编译过程

    前言 本文将介绍LNMP架构中Mysql.PHP.Nginx的源码编译过程:这时有人不仅会问:在我们使用的Linux系统中,可以从yum源中获得mysql.php,为什么要进行如此漫长复杂的过程进行编 ...

  10. gcc编译器和mysql源码哪个难_源码编译mysql 5.5

    http://blog.csdn.net/aidenliu/article/details/6586610 源码编译mysql 5.5+ 安装过程全记录 分类: Mysql 2011-07-05 21 ...

最新文章

  1. C语言中二维指针,C语言中怎样区分一维指针和二维指针?
  2. Java:十六进制转换成十进制
  3. 深度学习练手项目(二)-----利用PyTorch进行线性回归
  4. 什么叫做罗列式_陈列,罗列是什么意思?
  5. 接口 java性能_接口测试性能测试
  6. html 列表点,HTML + CSS:不带句点的有序列表?
  7. H.264的编解码流程
  8. [转载] python数据类型转换
  9. 为什么说图形数据库是大数据时代的利器?
  10. 新兴IT企业特斯拉(二)——特斯拉的诞生
  11. matlab指派问题求法,matlab求解指派问题
  12. 2022 Google IO大会新技术
  13. 阿里巴巴常用的 12 个后端开发工具,建议你快快收藏!
  14. 哈佛大学砸场子:DALL-E 2只是「粘合怪」,生成正确率只有22%
  15. 移动电源给路由器供电
  16. 实现 3D 时间动画展示效果
  17. simulink电机仿真学习 - SVPWM原理分析及仿真分析
  18. LabVIEW入门第六天(布尔控件及布尔量)
  19. 恒星绕太阳转css,地球绕太阳转,太阳绕银河系中心转,银河系绕着什么转?
  20. 因此,吉尔伯特教授建议

热门文章

  1. linux获取weblogic版本,LINUX查看JDK和Weblogic版本命令
  2. Ace Admin中表格按钮的使用方法——表格导出为xls、pdf,表格打印预览等
  3. 机顶盒怎样配置服务器信息,网络机顶盒桌面配置服务器
  4. Hamcrest 断言
  5. tomcat优化笔记
  6. 09.html使用iframe、embed查看pdf不显示(未解决),使用pdf.js预览pdf
  7. PHP验证码代码_php验证码类
  8. 最新Hadoop环境搭建流程
  9. Cocos Creator大厅+子游戏模式
  10. Linux抓包命令tcpdump以及常见抓包使用方法