代码改变世界

随笔分类 - MySQL Code Trace

MariaDB线程池源码分析

2013-05-25 07:57 by 心中无码, 2608 阅读, 收藏, 编辑
摘要: MariaDB线程池源码分析心中无码0前言 MySQL5.5的Enterprise版本以plugin的方式引入了thread pool,在并发请求数达到一定 数量的时候,性能相比社区版貌似有不少提高, 可以看下这个性能对比。在引入线程池之前,MySQL支持的线程处理方式(thread_handling参数控制)有no-threads和one-thread-per-connection两种方式,no-threads方式是指任一时刻最多只有一个连接可以连接到server,一般用于实验性质。 one-thread-per-connection是指针对每个连接创建一个线程来处理这个连接的所有请求,直到 阅读全文

MySQL源码学习——USE语句的秘密

2013-04-30 19:45 by 心中无码, 1604 阅读, 收藏, 编辑
摘要: MySQL源码学习——USE语句的秘密Louis Hust0Preface最近一个项目需要解析MySQL的通信协议,这时候便碰到了USE语句的解析,发现客户端 mysql发送到服务器端的USE语句对应的并不是SQLCOM_CHANGE_DB命令,而是COM_INIT_DB。 而且这两个命令的处理逻辑基本一致,都是调用mysql_change_db进行处理,那么什么时候 发送COM_INIT_DB,什么时候发送SQLCOM_CHANGE_DB命令呢?这便是本文需要解释的地方。0COM_INIT_DB 与 SQLCOM_CHANGE_DB首先解释下这两个命令,其实这两个命令不是在一个层次的,COM 阅读全文

MySQL Internals——IN,OR,BETWEEN哪个更快?

2013-02-07 22:46 by 心中无码, 2605 阅读, 收藏, 编辑
摘要: MySQL Internals——IN,OR,BETWEEN哪个更快?Louis Hust0前言 微博上看到@金山 提到了一个MySQL中的一个性能问题,select id from table where id > 100 and id < 200 和 select id from table where id = 101 or id = 103 or id = 104 or id = 105 or id = ...哪个更快?这里的查询条件有三种:between,or 和 in。这里id列是索引列,如果不是的话,三个查询都是全表扫描,性能差距应该不大。1准备环境mysql> 阅读全文

MySQL Internals-Index Merge优化

2013-01-28 22:39 by 心中无码, 3983 阅读, 收藏, 编辑
摘要: MySQL Internals-Index Merge优化Louis Hust0前言之前搞错了,以为Index Merge是MySQL5.6的新特性,原来不是,发现5.5也有,看了下manual,发现5.0的manual就已经存在了, 可以说是一个历史悠久的优化手段了,好吧,不管怎么样,今天就拨开其神秘的面纱,看看其内部到底如何生成这种Index Merge的计划的。 这里只详细介绍Intersect操作,对于Union和Sort-Union的具体代码,还没开始研究。1Index Merge理论基础Index Merge——索引归并,即针对一张表,同时使用多个索引进行查询,然后将各个索引查出来 阅读全文

MySQL5.6 Internals--隐藏的索引列

2013-01-27 16:56 by 心中无码, 2765 阅读, 收藏, 编辑
摘要: MySQL5.6 Internals-隐藏的索引列Louis Hust0前言今天本来想跟踪MySQL5.6中的新特性Index Merge,结果在跟踪的过程中,发现了一个问题,即InnoDB的二级索引中 可能会包含主索引,当然这里的包含并不是说二级索引的row里面会有pk的记录,这一点是一直存在的,这里的包含 是指,二级索引也会包含主索引进行排序。1现场重现1.1初始化数据mysql>showcreatetableindex_merge\G***************************1.row***************************Table:index_merg 阅读全文

MySQL Internals--How MySQL optimize single range

2013-01-26 19:06 by 心中无码, 479 阅读, 收藏, 编辑
摘要: MySQL Internals-How MySQL optimize single rangeLouis Hust0PerfaceWhen MySQL calculates the cost of QEP(Query execute plan), it will do a quick test for range scan with const values. But when the condition in where is complex, it should do the right thing for optimization, otherwise the exact plan ma 阅读全文

Understanding SELECT_LEX & SELECT_LEX_UNIT

2013-01-16 13:09 by 心中无码, 904 阅读, 收藏, 编辑
摘要: Understanding SELECT_LEX & SELECT_LEX_UNITLouis Hust0PrefaceSELECT_LEX(st_select_lex)&SELECT_LEX_UNIT(st_select_lex_unit) are two important structs in Optimizer. They are used from yacc grammer to senmantics and to optimizer at last. So they are also the basic of understanding the Optimizer. 阅读全文

Deep into MySQL QEP with optimizer_trace

2013-01-05 19:32 by 心中无码, 536 阅读, 收藏, 编辑
摘要: Deep into MySQL QEP with optimizer_traceLouis Hust0PrefaceMySQL5.6 add a new option to show QEP more deeply-optimizer_trace. This option is very different from EXPLAIN which just showes the table access method, index using, table join order and so on. But optimizer_trace output every steps of how th 阅读全文

MySQL Optimizer Analysis——Join types

2012-12-29 11:25 by 心中无码, 588 阅读, 收藏, 编辑
摘要: MySQL Optimizer Analysis——Join typesLouis Hust0前言通过EXPLAIN查看执行计划,其输出中较为重要的列为type列,此列决定了操作此表的类型,在MySQL内部,此列对应了 enum join_type。这里分别针对Manual中列举出来的各种不同的type,进行实例显示,让大家更加明确的了解各个type的实际意义, 有利于加深大家对explain输出的理解。由于MySQL5.6对Optimizer的代码进行了重构,条理上更加清晰,故本实验的环境是:Serverversion:5.6.6-m9-debug-logSourcedistribution 阅读全文

How to use NoSQL in MySQL

2012-11-21 16:19 by 心中无码, 576 阅读, 收藏, 编辑
摘要: How to use NoSQL in MySQL?Louis Hust1 IntroductionMySQL5.6 has already supported memcached, so we can say MySQL is a mixture of RDBMS and NoSQL. But there is few materials about how to install memcached in MySQL and how to use it, and that is the reason i write this article. In this article, i will 阅读全文

你真的了解如何登录MySQL么?

2012-07-21 15:59 by 心中无码, 3272 阅读, 收藏, 编辑
摘要: 昨天同事碰到一个问题,在MySQL上创建了一个用户,host设置为%,本地竟然无法登录。创建一个host为localhost的同名用户后,本地可以登录。感脚很怪异,下面我们重新分析产生这个问题的原因。1. 现场重现*root本地登录Shell>./mysql -urootWelcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.5.17-debug-log Source distributionCopyright (c) 2000, 2011 阅读全文

CSDN密码库窥视各大数据库性能

2011-12-26 17:30 by 心中无码, 6955 阅读, 收藏, 编辑
摘要: 很多同学一直抱怨手头木有一个真实的数据库,无法进行数据库性能试验,CSDN得知了同学们的苦恼,立刻开放了部分数据库,供同学们学习、参考,对CSDN这种大公无私、舍己为人的行为,有关部门对此进行了高度的赞扬,下面就带领同学们来进行一个小小的性能对比测试。 实验选择了三个数据库:Oracle11g、MySQL5.1以及DM7。Oracle作为商业数据库大哥大的代表,MySQL作为开源数据库的代表,DM7很多同学估计就不清楚了(达梦数据库),暂时作为国产数据库的代表吧(同学们轻拍^_^)。测试环境OSWINDOWS XP SP3CPUIntel i3 530 @2.93GHzMEMORY4GORAC 阅读全文

MySQL源码学习——MDL字典锁

2011-12-15 22:34 by 心中无码, 3056 阅读, 收藏, 编辑
摘要: 什么是MDL MDL,Meta Data lock,元数据锁,一般称为字典锁。字典锁与数据锁相对应。字典锁是为了保护数据对象被改变,一般是一些DDL会对字典对象改变,如两个TX,TX1先查询表,然后TX2试图DROP,字典锁就会lock住TX2,知道TX1结束(提交或回滚)。数据锁是保护表中的数据,如两个TX同时更新一行时,先得到row lock的TX会先执行,后者只能等待。MDL的设计目标字典锁在设计的时候是为了数据库对象的元数据。到达以下3个目的。1. 提供对并发访问内存中字典对象缓存(table definatin cache,TDC)的保护。这是系统的内部要求。2. 确保DML的并发性 阅读全文

MySQL源码学习——DBUG调试

2011-12-12 22:10 by 心中无码, 2756 阅读, 收藏, 编辑
摘要: 一、前言 在规模稍微大点的项目中,为了方便快速找到bug的所在,我们往往需要在代码中加入一些调试用的代码,比如加入一些printf,打印出一些重点的信息;加入assert,进行断言判断。这些比较随意的调试代码会使整个系统显得比较凌乱。于是Fred Fish开发了一套用于嵌入代码中的库,开发人员只需要调用相应的函数即可加入调试信息。 对于MySQL这种多线程的程... 阅读全文

Mysql源码学习——没那么简单的Hash

2011-10-14 21:08 by 心中无码, 2627 阅读, 收藏, 编辑
摘要: Hash链表的应用比较常见,其目的就是为了将不同的值映射到不同的位置,查找的时候直接找到相应的位置,而不需要传统的顺序遍历或是二分查找,从而达到减少查询时间的目的。常规的hash是预定义一定的桶... 阅读全文

Mysql源码学习——用户认证原理与实现

2011-08-30 20:48 by 心中无码, 2444 阅读, 收藏, 编辑
摘要: 前几节跟踪了Connection Manager和Thread Manager,在连接的过程中,还有一个身份认证的过程,就是大家所熟悉的 验证用户名和密码的过程,我们平时做一个系统的时候,很多时候都会涉及到身份验证。今天我们就来看下Mysql是如何进 行验证的。(注意是登录,不是登陆^_^) 阅读全文

Mysql源码学习——Thread Manager

2011-08-27 15:18 by 心中无码, 1875 阅读, 收藏, 编辑
摘要: 为了提高系统效率,减少频繁创建线程和中止线程的系统消耗,Mysql使用了线程缓冲区的概念,即如果 一个连接断开,则并不销毁承载其的线程,而是将此线程放入线程缓冲区,并处于挂起状态,当下一个新的Connection到来 时,首先去线程缓冲区去查找是否有空闲的线程,如果有,则使用之,如果没有则新建线程。本问主要介绍这个线程缓冲区, 首先介绍下基本的概念 阅读全文

Mysql源码学习——Connection Manager

2011-08-21 13:15 by 心中无码, 2387 阅读, 收藏, 编辑
摘要: 1.连接的线程数 Mysql支持单线程和多线程两种连接线程数。如果是单线程,则在同一时刻,只能有一个connection连接到Mysql,其他的连接会被挂起。如果是多线程,则同一时刻可以支持多个connection同时连接到服务器。 可以通过设置服务器的启动参数来设定连接的线程数:mysqld.exe --thread-handling=no-threadsmysqld.exe --thread-handling=one-thread-per-connection 服务器如何通过参数来选择使用哪种方式的呢?且看服务器中的分支代码:#ifdef EMBEDDED_LIBRARY one_th.. 阅读全文

Mysql源码学习——八度空间

2011-08-15 22:24 by 心中无码, 2655 阅读, 收藏, 编辑
摘要: 学习完词法分析和语法分析后,开始进入Mysql源码的正式学习之旅了。这么多模块,肿么入手呢?!还好从网上搜到了一个模块划分,以后就尽可能根据这个模块划分一步一步的跟踪源码,揭开Mysql的面纱。 我们从上至下来看各个模块的划分,首先客户端发送请求与服务器连接,通过connection manager模块,连接管理模块会调用Thread Manager模块,即线程管理模块,这里会为一个连接创建一个新的线程,专门为这个连接服务,这就保证了每个连接都有一个独立的线程为之工作,当然连接数一般也会有个限制,不然无限制的创建新的线程,操作系统也顶不住啊。接着进入了User Module,用户模块,这个模. 阅读全文

Mysql源码学习——源码目录结构

2011-08-12 10:08 by 心中无码, 3552 阅读, 收藏, 编辑
摘要: Mysql源码结构 阅读全文