![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
mysql源码相关
文章平均质量分 85
gao1738
这个作者很懒,什么都没留下…
展开
-
MySQL读写分离session_track_gtids解析
mysql读写分离实现可以基于wait_for_executed_gtid_set实现,而事务提交gtid的获取可依赖session_track_gtids实现。本文将简析session_track_gtids的运作机制。原创 2022-12-20 18:42:23 · 900 阅读 · 0 评论 -
Mysql 中的排序实现
本文主要是记录本人对mysql中关于结果集合排序的代码的阅读。由于马上要为公司的sqlproxy产品添加分表功能,对于被分的大表的查询需要在sqlproxy中进行merge,如果查询的语句有orderby的话,还需要进行排序。 所以想起看下mysql中是如何进行结果集排序的。1. 概述mysql内部执行一条语句大体上分为3个步骤,prepare, optimize和exec。(可以到原创 2015-01-18 20:15:42 · 399 阅读 · 0 评论 -
客户端mysql 添加新的启动选项
本文介绍如何在 mysql 的客户端启动程序 “mysql” 中添加新的启动选项: 修改文件:client/mysql.ccclient/client_priv.h 在client/mysql.cc 的全局变量声明处添加: static my_boolusing_exec_plan=0; //标识启用这个新选项(以上不需要)sta原创 2015-01-18 20:13:57 · 459 阅读 · 0 评论 -
在mysql客户端添加新的 客户端命令
在mysql中命令分为两大类, 一类是在客户端解析执行的,如help, quit等,另一类是在服务端解析(执行)的,如select,insert等。 注:在客户端执行的,有的也要调用服务端。本文主要介绍如何给mysql客户端添加新的客户端命令。用例: 添加一个命令 exec_plan (\E), 功能是类似于命令go,把用户敲入的命令简单处理后发送到服务端执行。修改代码: client/原创 2015-01-18 20:14:48 · 429 阅读 · 0 评论 -
mysql中semi-join的优化策略介绍
1. 背景介绍什么是semi-join?所谓的semi-join是指semi-join子查询。 该子查询具有如下结构:SELECT ... FROM outer_tables WHERE expr IN (SELECT ... FROM inner_tables ...) AND ...即在where条件的“IN”中的那个子查询。这种查询的特点是我们只关心outer_table中与s原创 2015-01-18 20:15:33 · 867 阅读 · 0 评论 -
如何在mysql中间件层实现客户端连…
很多情况下,mysql中间件程序会集成连接池功能,并且客户端的登录用户和实际操作后端数据库的用户为不同的用户。也就是说,中间件程序在客户端登录之前已经使用某个特定的用户名和密码建立了中间件到后端mysql的连接池;客户登入验证通过后就可以直接使用连接池中的连接。 这样设计的好处是可以多个用户共享一个连接池,即避免了每个客户重新创建连接的开销,也避免了为每个客户准备单独的连接池所带来的浪费。(原创 2015-01-18 20:19:27 · 881 阅读 · 0 评论 -
Mysql 中query cache 的代码导读
本文主要对mysql中SQL层的query cache代码阅读的记录。1. 背景知识(参考《Mysql性能调优与架构设计》)MySQL 可以看成是二层架构,第一层我们通常叫做 SQL Layer,在 MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql 解析,执行计划优化,query cache的处理等等;第二层就是存储引擎层,我们通常叫做 Storag原创 2015-01-18 20:15:04 · 451 阅读 · 0 评论 -
Mysql OK包与EOF包中的 server_sta…
这几天往sqlproxy中添加事务支持时发现服务端global/session的autocommit变量值与server返回的OK包中的值不一致。(当后端mysqld以autocommit=0启动的时候)当客户端向mysqld发送select等查询语句的时候,mysqld会在结果集合的末尾返回一个EOF包;(正确处理时)当客户端向mysqld发送insert等修改或管理语句的时候,mysq原创 2015-01-18 20:16:22 · 774 阅读 · 0 评论 -
使用源码build mysql5.5 以及 在进…
mysql是开源的,所以任何人都可以下载并且修改它的源代码。本文介绍如何在不安装的情况下直接执行并测试mysql代码。本文以ubuntu下mysql5.5为例。工具:bazaar(ubuntu 下 apt-get install bazaar)cmake (同上)1.使用bazzar下载mysql5.5(参考http://forge.mysql.com/wiki/MySQL_Ba原创 2015-01-18 20:14:45 · 387 阅读 · 0 评论 -
转: 多版本并发控制:PostgreSQL …
本文转载自:http://wangyuanzju.blog.163.com/blog/static/130292009107101544125/多版本并发控制技术被很多数据库或存储引擎采用,如Oracle,MS SQL Server 2005+, PostgreSQL,Firebird, InnoDB, Falcon, PBXT,Maria等等。新的数据库存储引擎,几乎毫无例外的使用多版原创 2015-01-18 20:15:20 · 494 阅读 · 0 评论 -
Mysql 中互斥锁的使用
本文介绍如在在多线程mysql代码开发中使用互斥锁。 mysql自己对c++的mutex又进行了一次封装,封装的代码可以在include/mysql/psi/mysql_thread.h 中找到。下面大概地介绍下如何使用互斥锁。锁的生命周期大体为: 初始化锁->*(上锁->解锁)->销毁锁。注 “*” 表示0个或多个。 初始化锁代码如下:1.首先声明锁变量和 key变量, key原创 2015-01-18 20:14:07 · 2649 阅读 · 0 评论 -
mysql RPM打包
本文介绍如何通过mysql的源码包进行RPM包的打包。主要的流程包括:获取源码包-》解压-》在解压中编译并生成spec文件-》创建RPM工作目录-》拷贝spec文件和源码包到工作目录-》进行打包获取源码包:源码包可以到官网下载,或者到lanchpad上用bazaar下载。从官网上一般只能下载最新GA的社区版,lanchpad上一般是最新的源码,虽然可以通过bazaar的版本管理re原创 2015-01-18 20:14:57 · 1056 阅读 · 0 评论 -
mysql 添加新启动选项(option)
本文将介绍如何在mysql中添加新的启动选项(option)。例如 mysqld --node_type=master 。 这个启动命令需要mysql提供对新选项node_type的支持。本文将介绍如何添加这个新选项,并且新增一个对应的系统global变量来存储这个参数值,这个系统变量能够通过mysql语句"show variables like 'node_type'" 来查询。1.原创 2015-01-18 20:14:23 · 450 阅读 · 0 评论 -
Mysql 中thread的动态内存管理
本文主要介绍mysql一个thread里如何管理它的动态内存的,通用与mysql中绝大部分的动态内存管理。1. 概述mysql中动态内存的管理结构为MEM_ROOT (include/my_alloc.h ).中thread的动态内存管理" TITLE="Mysql 中thread的动态内存管理" />free指向的是空闲块,used指向的是状态为满的数据块。当一个数据块中剩余的空间小原创 2015-01-18 20:15:10 · 750 阅读 · 0 评论 -
Mysql Innodb中undo-log和MVCC多版…
本文主要介绍mysql中innodb引擎undo-log和事务中MVCC多版本一致性读的实现。1. 概述Innodb引擎的undo日志是记录在表空间中单独的回滚段中。当mysql做update和delete操作的时候,实际的后台都是先把旧记录“删”了,如果是update和insert再把新记录“插入”进去。这里的删不是真的删除,而是标识它被删除了。而插入也不一定是真的插入,很多情况下原创 2015-01-18 20:15:23 · 623 阅读 · 0 评论 -
Mysql-innodb中死锁检测的代码
本文主要简单记录一下关于mysql innodb引擎中关于死锁检测与处理的代码的阅读。1. 概述innodb中检测与处理死锁的代码入口在:storage/innobase/lock/lock0lock.c 的lock_deadlock_occurs函数(大约3484行)。这个函数调用了lock_deadlock_recursive函数 迭代地检查死锁。当事务尝试获取(请求)加一个锁原创 2015-01-18 20:15:13 · 2783 阅读 · 1 评论 -
mysql中table cache 的代码导读
本文主要是简介一下mysql中关于table cache的代码实现。1. 背景知识mysql大体上可以分为两层,sql层和 引擎层。mysql 中的 table cache 位于sql 层。table cache的作用:The table cache holds descriptors for open tables. For frequentlyused tables, keepin原创 2015-01-18 20:15:17 · 663 阅读 · 0 评论 -
Mysql 中线程管理与连接池代码导读
本文主要讨论的是mysql中的连接模块。 该模块处理客户端与服务端间的通信,并且在服务端为每个客户端连接建立处理线程。1. 概述中线程管理与连接池代码导读" TITLE="Mysql 中线程管理与连接池代码导读" />上图为mysql中进程的状态变化图。1. 初始化一个新创建的线程(当缓存中没有可用的时),然后初始化它,并开始等待客户端请求2. 一个“waiting for com原创 2015-01-18 20:15:07 · 601 阅读 · 0 评论 -
Mysql 中 innodb 如何获取用于 生…
本文主要记录本人对innodb获取用于优化的统计信息代码的阅读与理解。1. 背景信息 当mysql服务端接收到客户端请求之后,它会对用户的sql语句进行解析,优化,和执行。 其中优化是mysql中最复杂的一块代码之一。它主要的功能是生成高效的执行计划。 所谓的执行计划,就是对查询相关表的使用顺序,以及对每个表使用哪种方式进行数据操作。 打个比方,假设innodb表原创 2015-01-18 20:15:26 · 483 阅读 · 0 评论 -
Mysql innodb auto_incr…
这一段时间在往sqlproxy1.9版本里添加对多行插入的insert的语句的支持,其中就涉及到了如何处理auto_increment字段的自增值分配问题。为此特别参考了一下mysql的内部实现,并记录一下。用例:我们以如下sql语句的执行过程中auto_increment字段的锁处理过程来讲解sql1: insert into t1 values (1),(null),(原创 2015-01-18 20:16:50 · 805 阅读 · 0 评论 -
在mysql中添加新源文件,以及 如何…
本文主要介绍如何在mysql 中添加新的源文件以及如何在客户端打印列表信息。这两个内容没有必然的联系,这里放在一起介绍主要是因为这两个功能我是一起尝试的。 1.添加新源文件mysql5.5的编译是基于cmake来进行的,所以当添加新的源文件的时候,需要在对应源码目录的cmake配置文件CMakeList.txt中添加新源文件的信息。本例中添加的新文件是gaoshow.h 和gaosh原创 2015-01-18 20:14:04 · 595 阅读 · 0 评论 -
如何在修改mysql代码添加新SQL命令
本文主要介绍如何在mysql中添加一条新SQL命令, 例如 DISPATCH ADD "gao",这条命令会去检查参数的值是否为“gao”, 如果是的话 就把全局变量node_type设为1 (默认为0).注:关于全局变量node_type请查看我的另一篇文章<<mysql添加新启动选项>> :http://hi.baidu.com/gao1738/blog/item/84ff8cde9原创 2015-01-18 20:14:10 · 954 阅读 · 0 评论 -
Mysql 中List的使用
本文介绍mysql 中List的使用。 I_List是mysql自己封装的一个list对象,并且mysql还封装了对应的iterator对象 I_List_iterator。具体的代码可以在sql/sql_list.h中找到。 建立一个I_ListI_List *var=newI_List; 添加数据class *a = new class; //注:这个class需要继承自i原创 2015-01-18 20:14:00 · 2784 阅读 · 0 评论