February 7, 2017
关于 InnoDB 索引长度限制的 tips
"\u003cp\u003e有同学问到InnoDB的索引长度问题,简单说几个tips。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e关于3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e大家经常碰到InnoDB单列索引长度不能超过767bytes,实际上联合索引还有一个限制是3072。\u003c/p\u003e\n\u003cp\u003e[\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/19130103_qFJc.jpg\" alt=\"\"\u003e][1]\u003c/p\u003e\n\u003cp\u003e可以看到,由于每个字段占用255*3, 因此这个索引的大小是3825(255*3*5)\u0026gt;3072,报错。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e为什么3072\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e我们知道InnoDB一个page的默认大小是16k。由于是Btree组织,要求叶子节点上一个page至少要包含两条记录(否则就退化链表了)。\u003c/p\u003e\n\u003cp\u003e所以一个记录最多不能超过8k。\n又由于InnoDB的聚簇索引结构,一个二级索引要包含主键索引,因此每个单个索引不能超过4k (极端情况,pk和某个二级索引都达到这个限制)。\n由于需要预留和辅助空间,扣掉后不能超过3500,取个“整数”就是(1024*3)。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e单列索引限制\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e上面有提到单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4\u0026gt;767, 于是增加了一个参数叫做 innodb_large_prefix。\u003c/p\u003e\n\u003cp\u003e这个参数默认值是OFF。当改为ON时, …\u003c/p\u003e"
February 6, 2017
由浅入深理解InnoDB的索引实现系列
"\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"http://mp.weixin.qq.com/s/osxa_3lFfL_H934dVm6Ttg\"\u003e由浅入深理解InnoDB的索引实现(1)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/FcizTIjPZ40jFJPqTsit8A\"\u003e由浅入深理解InnoDB的索引实现(2)\u003c/a\u003e\u003c/h2\u003e"
February 6, 2017
MySQL数据库InnoDB存储引擎Log漫游系列
"\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/FSxy3Dlxvl3q416zZfBuuQ\"\u003eMySQL数据库InnoDB存储引擎Log漫游(1)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"https://mp.weixin.qq.com/s/R8G5mqX57XobXFDVFSsNdw\"\u003eMySQL数据库InnoDB存储引擎Log漫游(2)\u003c/a\u003e\u003c/h2\u003e\n\u003ch2 id=\"activity-name.rich_media_title\"\u003e\u003ca href=\"http://mp.weixin.qq.com/s/OyC3QfIW2N-_I8SS-HS0Gw\"\u003eMySQL数据库InnoDB存储引擎Log漫游(3)\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e以上转自 \u003cem\u003e宋利兵\u003c/em\u003e 老师的公众号“\u003cstrong\u003eMySQL代码研究\u003c/strong\u003e”\u003c/p\u003e"
January 30, 2017
传统复制与 GTID复制的切换知识点
"\u003cp\u003e在5.6以后,可以通过命令动态修改.\u003c/p\u003e\n\u003cp\u003e注意有些命令是需要主从都要执行,有些命令是只在slave执行。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003egtid_mode 的几种状态值说明:\u003c/strong\u003e\nOFF: 不产生 GTID, 基于 binlog+position,也不能接受GTID的日志。默认值\nOFF_PERMISSIVE: 不生产 GTID,但作为slave可以识别GTID事务也可以识别非GTID事务\nON_PERMISSIVE: 产生GTID,slave可以处理GTID事务和非GTID事务\nON: 产生GTID事务,slave只接受GTID事务\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e实验一:将传统复制切换到GTID复制\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e启用GTID:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eset @@global.enforce_gtid_consitency=warn;\nset @@global.enforce_gtid_consistency=on;\nset @@global.gtid_mode=OFF_PERMISSIVE; #不产生gtid,但可以处理gtid\nset @@global.gtid_mode=ON_PERMISSIVE; #产生gtid,也可以处理gtid\nshow status like …\u003c/code\u003e\u003c/pre\u003e"
January 28, 2017
MySQL 5.7中的半同步复制
"\u003cp\u003e在5.7下半同步是以插件的形式出现的,所以在启用半同步前要先安装半同步插件 semisync_master.so\u003c/p\u003e\n\u003cp\u003eOn the master:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eINSTALL PLUGIN rpl_remi_sync_master SONAME \u0026#39;semisync_master.so\u0026#39;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOn slave slave:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eINSTALL PLUGIN rpl_semi_sync_slave SONAME \u0026#39;semisync_slave.so\u0026#39;;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在my.cnf里配置,要写在mysqld段\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emaster:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[mysqld]\nrepl_semi_sync_master_enable=1\nrepl_semi_sync_master_timeout=1000 #1 second\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eslave:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[mysqld]\nrepl_semi_sync_slave_enable=1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e卸载插件:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003euninstall plugin rpl_semi_sync_master; # master\nuninstall plugin rpl_semi_sync_slave; # slave\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e在主上设 …\u003c/p\u003e"
January 28, 2017
MySQL5.7下多源复制知识要点(原创)
"\u003cp\u003e架构为两主一从,两主为同一台服务器的多实例,安装方法请参考上篇文章 \u003ca href=\"http://blog.haohtml.com/archives/17300\"\u003ehttp://blog.haohtml.com/archives/17300\u003c/a\u003e。\u003c/p\u003e\n\u003cp\u003e主master1 IP: 192.168.1.116 PORT: 3306\n主master2 IP: 192.168.1.116 PORT: 3307\n从slave IP: 192.168.1.200 PORT: 3306\u003c/p\u003e\n\u003cp\u003e两主为全新安装。如果以前安装过的话,可以将原来的数据库删除掉,再执行 \u003ccode\u003ereset master\u003c/code\u003e 即可。(否则需要将两个主的想着库表使用 mysqldump到从中) \u003ccode\u003emy.cnf \u003c/code\u003e配置\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[master1 3306] \n[client]\nport=3306\nsocket=/data/mysql/mysql3306/tmp/mysql.sock\n\n[mysqld]\nbasedir=/data/mysql/mysql3306\ndatadir=/data/mysql/mysql3306/datadir\n#socket=/var/lib/mysql/mysql.sock …\u003c/code\u003e\u003c/pre\u003e"
January 22, 2017
xtrabackup 详解
"\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/gomysql/p/3650645.html\"\u003ehttp://www.cnblogs.com/gomysql/p/3650645.html\u003c/a\u003e\u003c/p\u003e"
January 20, 2017
Innodb中Page结构
"\u003col\u003e\n\u003cli\u003e一个存放记录(row)的page,由page header、page trailer、page body组成。如下图:\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_struct.png\"\u003e2\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_struct.png\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/page_struct.png\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epage的完整结构\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"http://blog.haohtml.com/wp-content/uploads/2017/01/page_full_struct.jpg\"\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/page_full_struct.jpg\" alt=\"\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003epage的结构详情参看如下:\u003c/p\u003e\n\u003cp\u003efrom: \u003ca href=\"http://forge.mysql.com/wiki/MySQL_Internals_InnoDB#InnoDB_Page_Structure\"\u003ehttp://forge.mysql.com/wiki/MySQL_Internals_InnoDB#InnoDB_Page_Structure\u003c/a\u003e High-Altitude Picture\u003c/p\u003e\n\u003cp\u003eThe chart below shows the three parts of a physical record.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eName****Size\u003c/strong\u003e\nField Start Offsets\u003c/p\u003e\n\u003cp\u003e(F\u003cem\u003e1) or (F\u003c/em\u003e2) bytes\u003c/p\u003e\n\u003cp\u003eExtra Bytes\u003c/p\u003e\n\u003cp\u003e6 bytes\u003c/p\u003e\n\u003cp\u003eField Contents\u003c/p\u003e\n\u003cp\u003edepends on content\u003c/p\u003e\n\u003cp\u003eLegend: The letter ‘F’ stands for ‘Number Of Fields’.\u003c/p\u003e\n\u003cp\u003eThe meaning of the parts is as follows:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eThe FIELD START OFFSETS is a list of numbers …\u003c/li\u003e\u003c/ul\u003e"
January 19, 2017
聚簇索引(clustered index )和非聚簇索引(secondary index)的区别
"\u003cp\u003e这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。\u003c/p\u003e\n\u003cp\u003eInnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用”where id = 14″这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。\u003c/p\u003e\n\u003cp\u003eMyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通 …\u003c/p\u003e"
January 12, 2017
innodb_rollback_on_timeout参数对锁的影响
"\u003cp\u003e\u003ca href=\"http://fireflyclub.org/?/article/37\"\u003ehttp://fireflyclub.org/?/article/37\u003c/a\u003e\u003c/p\u003e"
January 12, 2017
mysql 事务提交过程-两阶段提交
"\u003cp\u003e\u003ca href=\"http://www.cnblogs.com/yuyue2014/p/4738007.html\"\u003ehttp://www.cnblogs.com/yuyue2014/p/4738007.html\u003c/a\u003e\u003c/p\u003e"
January 12, 2017
如何查询mysql事务未提交
"\u003cp\u003e\u003cstrong\u003e注意这篇文章并非死锁的,而是锁等待\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e到information_schema库下面,查看下面这个表:\u003c/p\u003e\n\u003cp\u003einnodb_trx ## 当前运行的所有事务\u003c/p\u003e\n\u003cp\u003einnodb_locks ## 当前出现的锁\u003c/p\u003e\n\u003cp\u003einnodb_lock_waits ## 锁等待的对应关系\u003c/p\u003e\n\u003cp\u003e如果遇到死锁了,怎么解决呢?找到原始的锁ID,然后KILL掉一直持有的那个线程就可以了, 但是众多线程,可怎么找到引起死锁的线程ID呢? MySQL 发展到现在,已经非常强大了,这个问题很好解决。 直接从数据字典连查找。\u003c/p\u003e\n\u003cp\u003e我们来演示下。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e线程A,我们用来锁定某些记录,假设这个线程一直没提交,或者忘掉提交了。 那么就一直存在,但是数据里面显示的只是SLEEP状态。\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; set @@autocommit=0;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuery OK, 0 rows affected (0.00 sec)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; use test;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eReading table information for completion oftableandcolumn names\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eYou can turn …\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e"
January 9, 2017
mysql中的handler_read_%
"\u003col\u003e\n\u003cli\u003e\n\u003cp\u003emysql\u0026gt; show status like ‘handler_read_%’;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Variable_name | Value |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_first | 1 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_key | 1 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_last | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_next | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_prev | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_rnd | 0 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e| Handler_read_rnd_next | 21 |\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e+———————–+——-+\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e7 rows in set (0.01 sec)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e如上所示,mysql中关于read的计数器,有7个。他们的数值对于系统的状况的了解,对于系统的调优都十分重要。我们应该理解他们的含义。本文是自己的一些理解。\n首先7个计数器,我们应该分为两部分:\n1)对索引读的计数器:前面的5个都是对索引读情况的计数器, …\u003c/p\u003e"
January 3, 2017
B+ TREE 结构
"\u003cp\u003e\u003cimg src=\"https://blogstatic.haohtml.com//uploads/2023/09/btree.jpg\" alt=\"img\"\u003e\u003c/p\u003e\n\u003cp\u003e其中key 是索引, \u003ccode\u003ed1\u003c/code\u003e、\u003ccode\u003ed2\u003c/code\u003e是索引对应的值,包含更多的信息。\u003c/p\u003e"
December 20, 2016
gitlab修改时区
"\u003cp\u003e刚装的系统,默认时间是UTC,比北京时间少了8个小时.\u003c/p\u003e\n\u003cp\u003e修改 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml 配置文件中的 time_zone : ‘Beijing’\u003c/p\u003e\n\u003cp\u003e重启gitlab 即可\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#gitlab-ctl restart\n\u003c/code\u003e\u003c/pre\u003e"