- 浏览: 797210 次
- 性别:
- 来自: 杭州
最新评论
-
137578346:
...
各版本MySQL并行复制的实现及优缺点 -
db_code_peon:
引用而这个“调整”,也不是简单的指针重赋,而是将这个page ...
MySQL源码学习:简述InnoDB的BP LRU策略 -
xtha21:
预申请ID的个数为:大于批量插入记录数的最近一个2的指数值再- ...
MySQL源码学习:innodb_autoinc_lock_mode 下自增id不连续的原因 -
lc15808798846:
奇哥好试了下,好像这个问题在5.7 已经不存在了,SQL不会h ...
autocommit=0引起的业务hang住 -
wangliushui:
Transfer 怎样保证事物的一致性,一个事物关联多个表的 ...
MySQL-Transfer2.2发布
文章列表
背景
客户报告了一个count(distinct)语句返回结果错误,实际结果存在值,但是用count(distinct)统计后返回的是0。
将问题简化后复现如下,影响已知的所有版本。
drop table if exists tb;
set tmp_table_size=1024;
create table tb(id int auto_increment primary key, v varchar(32)) charset=gbk;
insert into tb(v) values("aaa");
in ...
Transfer 2.2发布。下载地址
版本说明
1、 基于版本 Percona-5.5.31 ,简单用法是先安装好官方或PS版5531,然后替换为transfer的mysqld。
2、 新增观察参数 Com_ts_*
在压测过程中,可使用如下命令观察
mysqladmin --socket=run/mysql.sock -uroot extended-status --relative --sleep=1 | grep Com_ts
得到如下图的示例
背景
上一篇说到MySQL 5.5加主键导致阻塞源表的读的问题。
有同学提到从调用函数看,在默认的old_alter_table=off的情况下,加主键过程没有看到copy to tmp table。
这里我们再细说一下。
说说fast index creation
在MySQL 5.1以后InnoDB引入了fast index creation。在有这个feature之前,MySQL认为所有的加减索引操作都必须创建临时表、拷贝数据、删除源表。
有了这个神奇的功能之后,InnoDB跟M
背景
有同学讨论到MySQL 5.5下给大表加主键时会锁住读的问题,怀疑与fast index creation有关,这里简单说明下。
对照现象
为了说明这个问题的原因,有兴趣的同学可以做对比实验。
1) 在给InnoDB ...
背景
跟同学聊到row_id一个边界问题,这里详细说明下。
InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复用。
需要注意的是,虽然dict_sys->row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节,因此最大值是2^48。 row_id超过这个值还是会递增,只是写入的时候只取低位,可以认为是做取模操作。
问题
这就涉及到一个问题,一个长期运行的MyS ...
前天在微薄上发了个优化器的问题,从评论来看,还是需要简单说明一下。
现象说明
其实这里主要要说明的是一个优化器还需要改进的地方。
优化器会根据where条件和select_list里面的字段决定在使用一个索引(sta)后,是否需要回表—回到聚集索引取数据。
基本的做法是:在确定了一个索引后,将select_list和where中出现的所有字段都拿来判断一下,如果字段都存在于sta索引中,则可以使用覆盖索引。
第一个explan可以用上覆盖索引(Using Index),
今天一位同学问到线上曾经碰到过连续建表,导致阻塞普通的insert、update等。不过也没有保留现场。因此有疑问为什么建表会影响DML?
分析
首先这个现象不是在所有场景都会碰到(否则MySQL的用户们早就跳起来了)。
一来建表这个操作本身很快,只涉及到写表定义文件和初始化表空间。中间涉及到redo和undo的操作也很少(这里只讨论InnoDB表)。因此除非碰到磁盘
背景
有同学问到这样一个问题:原来的binlog格式是statement,为什么执行了 set global binlog_format='row' 和 set binlog_format='row',在binlog里面还是会看到有生成statement格式的事件?
变量分类
很多文章都说到MySQL的按照可见性范围分成两类 session和global
背景
上篇文章我们介绍了MySQL支持的compound statement SQL的语法。有同学指出这个只是“部分compound”,因为这种多语句语法中不支持if这样的逻辑操作,因此在业务中的使用会受限。
这里我们给出一个常见的事务的逻辑。
1)
背景
将多个语句发给MySQL,可以减少网络交互次数。对于带事务的情况,可以缩短单线程上事务的生存期。
将业务逻辑写成存储过程是一种形式,但是考虑到这样等于是将业务逻辑绑定在服务端,不是最佳选择。
有同学提到希望MySQL能够支持类似Oracle的compound-statement SQL ,实际上MySQL在5.0
背景 Adaptive hash index (AHI) 是InnoDB中用于加速索引查找的一个结构。InnoDB本身不支持hash索引,所有的索引检索都走B树查询。AHI可以认为是“索引的索引”。当对一个页面的访问次数满足一定条件后,将这个页面的地址存在一个hash表中,下次查询可以直接访问到页面,不需要走B树查询。
问题 天下没有免费的午餐,在加速查询的同时,AHI与其他缓存结构一样,也面临维护的问题。作为一个全局结构,在更新时必然有一个全局锁操作(btr_search_latch),一个查询里面可能会对其作多次加x_lock操作。
Percona的改进 如同Buf ...
背景
为了提供优化器支持,InnoDB维护了每个表的索引统计信息(index statistics)。在之前的一篇文章中作过介绍。
文章里面介绍到索引统计信息有几个更新策略,并建议允许关闭动态更新。顺便提及, ...
背景 今天在讨论frm丢失后drop database失败的问题。简单复现如下。假设test库中有两个表t1, t2,执行如下脚本:
bin/mysql -uroot –socket=run/mysql.sock -e ”drop database if exists test2;create database test2;use test2;create table t1 like test.t1;create t ...
前几天有位开发的同学问了个问题,InnoDB的group commit效果如何?之前说好了回头给看下,结果险些拖过年。
Group commit背景 InnoDB的redo log的group commit历史比较悠久了(有别于binlog的group commit)。如果设置为1,每次事务提交都至少需要写一次redolog。这对IOPS冲击严重,尤其是在HDD上,直接成为性能瓶颈。 Group commit的基本想法是将多个并发线程对redo的fsync操作合并成1个。具体的过程可以参照这篇。
Group commit的效果
其实效果 ...
5.6 的新增特性,允许对DML语句做explain。这下大家高兴了,碰到复杂更新语句(且还造成慢查询)要自己手动改成select语句的日子终于到头了。
饶有兴致的试用了一把,总体感觉不错,不过发现一个bug。
复现
my ...