![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 78
iteye_621
这个作者很懒,什么都没留下…
展开
-
MySQL源码学习:关于 'A' =='A '的问题
昨天一位同事问到一个问题,他的MySQL中导入数据的时候,发现唯一索引冲突,原因是有两行记录,区别只是有一条记录多了最后的一个空格。 希望有方法将他们设置不同。 复现: CREATE TABLE `t` ( `c` varchar(20) NOT NULL DEFAULT '', PRIMARY KEY (`c`)) ENGINE=InnoDB DEFAUL...2011-05-21 21:53:05 · 88 阅读 · 0 评论 -
MySQL源码学习:关于慢查询日志中的Rows_examined=0
最近在一个项目中DBA同学问了一个问题:为什么很多慢查询日志中显示 Rows_examined : 0? 需要说明的是, 这类慢查询语句都是类似 select count(*) from (…)t; 在说明这个问题之前,我们先指出两个相关背景:1、MySQL的临时表,都是MyISAM的。2、MyISAM表中的记录总数是额外存储的,count(*)的时候不需要遍历数据。...2011-07-02 18:11:11 · 6678 阅读 · 0 评论 -
MySQL源码学习:索引使用统计功能
今天刚刚知道Oracle有个索引统计的功能,可以统计每个索引的使用次数。作为一个Oracle的门外汉,我还是再次感叹人家做的是真细致。第二个想法就是给MySQL也加上。Percona版本的information_schema.innodb_index_stats 已经有索引的统计信息,我们就在巨人的肩膀上踩一脚了。先来看下原来的表结构。CREATE TEMPORARY T...2011-07-04 17:11:48 · 98 阅读 · 0 评论 -
关于InnoDB事务的一个“诡异”现象
在隔离机制中,InnoDB默认采用的Repeatable Read 和MVCC机制保证在事务内部尽量保证逻辑一致性。但如下的现象依然让人觉得不太合理。 1、复现a) 表结构CREATE TABLE `t` ( `a` int(11) NOT NULL DEFAULT ‘0′, `b` int(11) DEFAULT NULL, PRIMARY KEY...2010-11-06 19:01:48 · 140 阅读 · 0 评论 -
一个例子与InnoDB索引的几个概念
1、一个简单的sql语句问题 假设当前我们有一个表记录用户信息,结构如下: a) 表结构CREATE TABLE `u` ( `id` int(11) NOT NULL DEFAULT ‘0′, `regdate` int(1) unsigned, ….. PRIMARY KEY (`id`), KEY `regdate` (`regda...2010-11-06 19:04:49 · 96 阅读 · 0 评论 -
mysql无法正常关闭问题追查
本文的追查过程来源于某次mysql无法正常关闭。 1、复现第一次出现时环境比较复杂,多次试验后发现,如下过程能够稳定复现。a) 系统环境gcc版本Using built-in specs.Target: x86_64-redhat-linuxConfigured with: ../configure –prefix=/usr –mandir=/usr/shar...2010-11-06 19:08:35 · 253 阅读 · 0 评论 -
MySQL自动测试框架介绍
1、概述在我们給MySQL打了patch后,不仅需要测试新增的功能,同时更重要的问题是,需要对原有的功能作回归――若新增的patch导致原有其他功能产生bug,就得不偿失。MySQL自动测试框架是一个以MySQL框架和内部引擎为测试对象的工具。主要执行脚本在发布路径的mysql-test目录下。自动测试框架的主要测试步骤,是通过执行一个case,将该case的输出结果,与标准的输出结果作d...2010-11-07 01:27:25 · 678 阅读 · 0 评论 -
在information_schema中“创建”和维护表
Information_schema是MySQL自带的信息数据库。里面的“表”保存着服务器当前的实时信息。最近实现的一个patch,是要在数据库中增加一个统计, 统计结果以表的形式呈现,因此必须在information_schema库中增加一个表,需要了解这些表的存在形式,以及“维护数据”的方式。本文描述information_schema库中表的存在形式,访问时的调用方法,以及在该库中增...2010-11-08 15:43:25 · 429 阅读 · 0 评论 -
关于MySQL中Y和~问题
最近在坛子里还看到说到Y和~的问题,不知道mysql官方的bugs里面安排到什么时候解决这个bug。这里描述一下,说明一下原因。 1、 问题描述mysql> create table t (c char(32)) engine=innodb;Query OK, 0 rows affected (0.01 sec)mysql>...2010-11-09 11:29:40 · 192 阅读 · 0 评论 -
让MySQL支持欧元字符
本文说明一下MySQL中不支持欧元字符的原因及解决方法。 1、 问题描述在mysql中插入的字符串中若包含欧元字符(€),会发现该字符及以后的字符串都变得“不可见”。实际上这里并非不可见,而是根本没有进入数据库中。简单描述步骤如下:root@test 05:15:41>create table t(c char(32)) engine=i...2010-11-14 17:41:29 · 210 阅读 · 0 评论 -
关于InnoDB中buf_page_is_corrupted的优化
函数buf_page_is_corrupted (innodb_plugin/buf/buf0buf.c)这个函数,是在InnoDB中获取page数据后,对page作校验,判断内容是否损坏。在压力测试中发现,innodb.so最耗费cpu的就是这个buf_page_is_corrupted。 Percona对这个函数作了优化。本文介绍与此有关的配置、优化原理以及进一步的优化空间...2010-11-24 22:30:40 · 184 阅读 · 0 评论 -
MySQL内置结构hash表的使用
最近实现的两个patch都使用到了MySQL内置的hash结构。这个结构在MySQL框架层中被多处使用,理解它可以方便代码阅读。1、 总体InnoDB中也有自带的HASH表, 本文中介绍的是MySQL框架层的hash表。 其定义的头文件在include/hash.h,实现位置mysys/hash.c。内部存储数据使用了动态数组DYNAMIC_ARRAY。这个ha...2010-11-30 00:10:10 · 82 阅读 · 0 评论 -
MySQL中NULL字段的比较问题
最近有人问我MySQL中一个字段不论=NULL还是<>NULL都匹配不了数据,是在框架层实现的还是在存储引擎层实现的,我说你看看如果InnoDB表和MyISAM表都有这个现象,那就比较可能是在框架层。当然这个答案跟没有回答一样,我们可以从代码上看看具体的实现部分。 1、 现象描述表结构CREATE TABLE `t` ( `c`...2010-12-06 21:21:25 · 744 阅读 · 0 评论 -
MySQL“异象”分析:备库的io util比主库重?
同事问了个线上现象:主备机器配置一样,主库上有更新查询,备库设置为主库的从库,没有其他更新和查询压力。但备库的io util比主库的重。本来看主库的压力比较大,想把一部分查询切到备库,一看io这样,不太敢切。 1、原因这个原因两年前在之前公司碰到过一次,只是现象不同。那个现象描述起来比较复杂,这回刚好借这个现象说明一下。原因还是从srv_master_thread说起。这个Inno...2011-08-17 23:49:55 · 121 阅读 · 0 评论 -
InnoDB Insert抖动问题及其改进
背景日志型应用的一个典型操作,是周期性地有大量的insert操作。这类操作需要对扩展表空间。 分析在InnoDB里,扩展表空间的操作是在语句执行过程中,由执行线程直接调用的。尤其是对于一些表每行比较大,则会出现每插入几条记录就需要扩展表空间。虽然有insert buffer和write ahead logging策略保证在执行线程中不直接操作表数据文件,但扩展表空间的...2011-12-20 16:50:49 · 108 阅读 · 0 评论 -
MySQL源码学习:InnoDB关于group commit的简单QA
前天同事问了个问题,今天又再翻了下group commit。关于这个话题Kristian Nielsen有一个很详尽的系列文章(http://kristiannielsen.livejournal.com/12254.html), 有四个页面,文中有链接。这里列出一些细节,主要是对上面文章补充一下。 Q:什么是group commit。 A:1) 简单...2011-09-19 00:36:39 · 170 阅读 · 0 评论 -
InnoDB表快速修改字段名方案
最近被问到一个问题,InnoDB表,只修改一个字段的名字,定义不修改,是否有快速方案。这个需求的意义来源于,在表设计初期可以预留一些字段,但在预留字段投入使用时,最好能够赋予一个有意义的名字以方便使用。 复现以下实验基于5.1.48版本。创建一个简单表 CREATE TABLE `t` ( `c1` int(11) DEFAULT NULL, `c...2010-12-30 23:33:37 · 131 阅读 · 0 评论 -
InnoDB表快速修改varchar字段长度方案
前一篇文章末尾提到InnoDB快速修改字段长度。其实用场景在于,在设计表时,若需要预留varchar类型字段,还无法确定实际需要的长度。而当需要启用到预留的字段时,表中可能已经有很多数据,此时要根据需要修改字段长度, 若能够不需要重做数据,则能够减少这个修改操作对线上服务的影响。 几点说明1、 注意到这里适用的是varchar类型, char类型不在本文讨论范围内。实际上,由于var...2011-01-05 11:40:08 · 342 阅读 · 0 评论 -
MySQL权限控制的设计缺陷?
这个问题是从被问到information_schema.user_privilege的IS_GRANTABLE字段问题开始查起的,就先从user_privilege表的显示规则说起。 1、 IS_GRANTABLE字段用root账号执行如下语句(本文中grant后都接flush privileges, 不赘述)a) grant all privile...2011-01-18 15:10:46 · 254 阅读 · 0 评论 -
MySQL核心类THD介绍之user_connect
应元同学说要系统介绍一下THD类。我表示这个类太大,如果只是将字段意义依次列出意义不大,最好是碰到问题将相关的字段再说明,能关联更多信息。最近的一个patch中刚好碰到user_connect(好吧,是误用), 就介绍一下。 1、 字段说明THD::user_connect字段是USER_CONN类型,声明在sql/structs.h. 其作用是记录当前连接用...2011-01-25 17:59:29 · 264 阅读 · 0 评论 -
MySQL源码学习:InnoDB的ib_logfile写入策略
ib_logfile是InnoDB的事务日志文件。本文简要说明其写入时机、写入策略及如何保证数据安全。 1、 基本概念a) ib_logfile文件个数由innodb_log_files_in_group配置决定,若为2,则在datadir目录下有两个文件,命令从0开始,分别为ib_logfile0和ib_logfile.b) ...2011-02-15 13:36:22 · 126 阅读 · 0 评论 -
MySQL源码学习:ib_logfile、bin-log与主从同步
今天研究MySQL主从同步的同事问了一个问题,如果InnoDB写完ib_logfile后,服务异常关闭。会不会由于主库能够根据ib_logfile恢复数据,而由于bin-log没写导致从库同步时少了这个事务?或者反之,bin-log写成功,而ib_logfile没有写完,导致从库执行事务,而主库不执行? 这会导致主从不一致。本文简要说明下这个问题。 1、 ...2011-02-15 17:47:54 · 129 阅读 · 0 评论 -
MySQL源码学习:简述InnoDB的BP LRU策略
本文简要说明InnoDB的Buffer Pool(BP)的结构、基本运行方式和策略。 1、LRU的基本形态 由于涉及到淘汰机制,Buffer Pool (BP)内需要一个LRU链。这个LRU链表的基本形态如下: 从图中看到,LRU是一个链表(双向,图中没有画出反向指针)。同时有一个LRU_old(buf_pool->LRU_old)指针指向...2011-02-18 16:46:52 · 248 阅读 · 0 评论 -
MySQL中varchar最大长度是多少?
被问到一个问题:MySQL中varchar最大长度是多少?这不是一个固定的数字。本文简要说明一下限制规则。1、限制规则字段的限制在字段定义的时候有以下规则: a) 存储限制varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。 ...2011-02-22 10:47:23 · 514 阅读 · 0 评论 -
一种MySQL主从同步加速方案
一、问题起源MySQL的主从同步一直有从库延迟的问题,背景资料网上很多,原因简单描述如下: 1、 MySQL从库上有一个IO线程负责从主库取binlog到写到本地。另外有一个SQL线程负责执行这些本地日志,实现命令重放; 2、 正常网络状况下IO线程没有性能问题(这个待会会用到),问题是SQL线程只有一个,更新速度跟不上。所以经常会看到从库的CPU idle很高,但同步性能就...2011-09-24 14:45:26 · 149 阅读 · 0 评论 -
MySQL非源码学习:关于存储过程的中游标两个容易忽略的点
今天写个稍微复杂一点点的存储过程碰到两个容易忽略的点分享一下。如果有筒子刚好碰到相同的问题可以少再纠结一下, 木有啥技术含量的。。。 1、一个存储过程使用游标的例子假设很简单的一个要求:从t表里面遍历出f,然后再到t2表中查找符合条件的记录打出来。 declare stopFlag int;DECLARE cur_name CURSOR for f from t;...2011-09-27 00:57:45 · 55 阅读 · 0 评论 -
一种MySQL主从同步加速方案-改进
上一篇提出了一种改进主从延迟的方案。虽然能够实现主从无延迟同步,但在维护上比较复杂,还存在网络消耗问题,这里是一个改进的版本。 一、之前方案简述及问题分析方案如图。其中用多个MySQL充当transfer的角色。每个transfer负责同步master的一部分表。在我的试验中有8个transfer,也就是有8个MySQL实例。 问题: 1、维护复杂。在从库及其上需要增加8个...2011-10-08 20:04:53 · 125 阅读 · 0 评论 -
MySQL源码学习:MySQL中禁止跨库访问的实现
先说一下这里“跨库”的意思:当前use的是db1, 仍可以使用select * from db2.table1来访问table1表。这样使得我们需要访问同一个MySQL下的其他表时不需要多一次use,也使得多个库间的表join这样的操作成为可能。 1、 问题背景但有些使用场景下是有禁掉这种功能的需求。比如一些开放应用托管服务,一般给一个应用指...2011-10-16 16:54:21 · 278 阅读 · 0 评论 -
MySQL部分表复制配置下存在的运维风险、原因及一种方案
大家都知道 replicate-wild-do-table可以配置只同步部分表,由于其支持通佩符,带来便利。但也存在一些风险。 问题描述: 假设M、S两个MySQL Server, S设置为M的从库,且设置replicate-wild-do-table=test.a%. 此时在M库按照如下顺序操作:1) create table a1(f in...2011-10-22 16:44:03 · 62 阅读 · 0 评论 -
An example about consistent read and next-key lock in InnoDB
This article begins with a misunderstanding to discuss consistent read and next-key lock, and end up with a bug in MySQL optimizer. All bellow are based on the default isolation level, repeatable re...2012-01-18 22:23:33 · 120 阅读 · 0 评论 -
关于 innodb_stats_on_metadata 的设置问题
这个问题来自冷之同学测试时候碰到的一个“诡异现象”。 1、 测试现象 测试的库有很多数据,但是重启之后,只对一个表的5w条记录作查询。查询条件客户端控制,确保查询范围。innodb_buffer_pool_size设置为35G。现象1:查询性能会出现大幅度抖动;现象2:介入追查后发现,Innodb_buffer_pool_pages_free = 0 ...2012-07-03 16:23:42 · 955 阅读 · 0 评论 -
MySQL加非聚簇索引造成core dump及简单分析
本文从5.1.48下的一个bug说起。前提是新特性fast index creation. 1、现象 5.1.48 (InnoDB plugin 1.0.9)Session1Session2create table tb(a int)engine=innodb;insert into tb val...2012-02-01 15:08:25 · 93 阅读 · 0 评论 -
A new parameter to control updating statistics strategy
If a table contains several indexes and a select query does not have a “force index” hint clause, the MySQL optimizer take charge of determining which index to use. In some cases, we find tha...2012-02-02 17:17:10 · 126 阅读 · 0 评论 -
mysqldump新增参数控制插入数据和建索引顺序
InnoDB有个特性“fast index creation”,创建和删除非聚簇索引时不需要重建表。这句是转载的:This mechanism also means that you can generally speed the overall process of creating and loading an indexed table by creating the table wit...2012-02-07 20:34:40 · 349 阅读 · 0 评论 -
一个简单的patch--MySQL禁止新连接
1、 问题背景这个patch基于这样的需求:a) 在MySQL刚刚启动时,有些情况下DBA希望能够先做一些操作,然后再允许应用连接进来。b) 在一个全长连接高并发的服务出现一些特别耗费资源,导致影响整机服务的连接,kill以后客户端马上又连上来,“杀不掉” 因此考虑如果有个开关能够暂时禁止普通用户连接,能够满足上述两个需求。 2、 ...2012-02-11 14:01:12 · 134 阅读 · 0 评论 -
MySQL多线程同步MySQL-Transfer介绍
一、关于TransferMySQL-Transefer(下称Transfer)是一个基于MySQL+patch后得到的主从同步工具。其主要目的是为了解决原生版本的主从同步里,从库是单线程apply主库的binlog,导致的延迟。最近完成测试的版本将multi-master (by P.Linux)合并到Transfer中并针对支付宝的应用需求做了定制性能改进。这里做一个已经完成的完整功...2012-07-08 18:33:53 · 172 阅读 · 0 评论 -
MySQL源码学习: concat + outfile的bug 原因分析
项目中碰到一个bug,需要将MySQL表中的数据导出,字段中间用逗号隔开。 1、复现 步骤: 版本 5.1.48 a) 准备数据CREATE TABLE `test` ( `id` int(11) DEFAULT NULL, `data` char(10) DEFAULT NULL ) ENGINE=InnoDB D...2011-04-14 10:26:21 · 183 阅读 · 0 评论 -
InnoDB big-end问题和一个小优化
1、背景 InnoDB引擎存储int类型时使用big-endian, 而MySQL使用litter-endian, 导致一个问题是在两个层之间拷贝int类型数据的时候必须用一个循环来处理,而不能直接memcpy。 在引擎层返回数据量很大的情况下,很耗cpu。 在报表类的一些查询中,会访问大量的数据。我们有个项目的一个查询需要访问到1.4w个bigint,这个时候c...2012-02-14 17:21:10 · 106 阅读 · 0 评论 -
MySQL异构数据同步--tair为例
在实现levelDB挂载成MySQL引擎时,发现在实际存储是key-value格式时候,MySQL的异构数据同步,可以更简单和更通用。以tair为例,简要描述一下以MySQL为基础的一种方案。所谓异构数据同步,是指应用只更新MySQL,而由后端的某些机制将这些更新应用到其他数据存储服务上。1、MySQL-Tair 引擎a) 使用b) 说明这不...2012-02-22 00:21:23 · 260 阅读 · 0 评论 -
MySQL小误区:关于set global sql_slave_skip_counter=N 命令的一些点
背景知识1: 在主从库维护中,有时候需要跳过某个无法执行的命令,需要在slave处于stop状态下,执行 set global sql_slave_skip_counter=N以跳过命令。常用的且不易用错的是N=1的情况,但N>1时,则不那么顾名思义,本文详细介绍N的意义,及使用注意事项。 背景知识2: MySQL从库从主库上复制binlog文件内容到本...2011-11-05 14:00:34 · 109 阅读 · 0 评论