1.基本概念.md

预写日志(WAL)

预写日志(WAL,Write Ahead Log)是关系型数据库中用于实现事务性和持久性的一系列技术。简单来说就是,做一个操作之前先讲这件事情记录下来。

LSM树

LSM树全称是基于日志结构的合并树(Log-Structured Merge-Tree)。No-SQL数据库一般采用LSM树作为数据结构,HBase也不例外。众所周知,RDBMS一般采用B+树作为索引的数据结构,如图1。RDBMS中的B+树一般是3层n路的平衡树。B+树的节点对应于磁盘数据块。因此对于RDBMS,数据更新操作需要5次磁盘操作(从B+树3次找到记录所在数据块,再加上一次读和一次写)。
在RDBMS中,数据随机无序写在磁盘块中,如果没有B+树,读性能会很低。B+树对于数据读操作能很好地提高性能,但对于数据写,效率不高。对于大型分布式数据系统,B+树还无法与LSM树相抗衡。

B+ Tree 原理

  1. 数据结构

B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。

B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。

在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。

  1. 操作

进行查找操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data。

插入删除操作会破坏平衡树的平衡性,因此在插入删除操作之后,需要对树进行一个分裂、合并、旋转等操作来维护平衡性。

  1. 与红黑树的比较

红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+ Tree 作为索引结构,主要有以下两个原因:

(一)更少的查找次数

平衡树查找操作的时间复杂度等于树高 h,而树高大致为 O(h)=O(logdN),其中 d 为每个节点的出度。

红黑树的出度为 2,而 B+ Tree 的出度一般都非常大,所以红黑树的树高 h 很明显比 B+ Tree 大非常多,查找的次数也就更多。

(二)利用磁盘预读特性

为了减少磁盘 I/O,磁盘往往不是严格按需读取,而是每次都会预读。预读过程中,磁盘进行顺序读取,顺序读取不需要进行磁盘寻道,并且只需要很短的旋转时间,速度会非常快。

操作系统一般将内存和磁盘分割成固态大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点。并且可以利用预读特性,相邻的节点也能够被预先载入。

MYSQL 执行过程

MYSQL执行过程

MYSQL 存储结构

MySQL表中的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment)、区(extent)、页(page)、行(row),逻辑结构如下图:

  • 段(segment)
    表空间是由不同的段组成的,常见的段有:数据段,索引段,回滚段等等,在 MySQL中,数据是按照B+树来存储,因此数据即索引,因此数据段即为B+树的叶子节点,索引段为B+树的非叶子节点,回滚段用于存储undo日志,用于事务失败后数据回滚以及在事务未提交之前通过undo日志获取之前版本的数据,在InnoDB1.1版本之前一个InnoDB,只支持一个回滚段,支持1023个并发修改事务同时进行,在InnoDB1.2版本,将回滚段数量提高到了128个,也就是说可以同时进行128*1023个并发修改事务。

  • 区(extent)
    区是由连续页组成的空间,每个区的固定大小为1MB,为保证区中页的连续性,InnoDB会一次从磁盘中申请4~5个区,在默认不压缩的情况下,一个区可以容纳64个连续的页。但是在开始新建表的时候,空表的默认大小为96KB,是由于为了高效的利用磁盘空间,在开始插入数据时表会先利用32个页大小的碎片页来存储数据,当这些碎片使用完后,表大小才会按照MB倍数来增加。

  • 页(page)
    页是InnoDB存储引擎的最小管理单位,每页大小默认是16KB,从InnoDB 1.2.x版本开始,可以利用innodb_page_size来改变页size,但是改变只能在初始化InnoDB实例前进行修改,之后便无法进行修改,除非mysqldump导出创建新库,常见的页类型有:数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。

  • 行(row)
    行对应的是表中的行记录,每页存储最多的行记录也是有硬性规定的最多16KB/2-200,即7992行(16KB是页大小,我也不明白为什么要这么算,据说是内核定义)

MySQL InnoDB 索引原理

树的高度

参考资料


2.mysql运维.md

mysql.sock错误修复

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'/tmp/mysql.sock' (2)

问题根源:mysql.sock文件找不到了

问题场景:一般为该文件被误删,或者PHP等后端指定的该socket文件地址路径不对

解决方案:

1 . 重启

ps -auxf | grep mysql
kill -SIGKILL pid(找到指定的mysql进程pid)
./mysqld_safe

2 . 或者使用locate mysql.sock定位,同时重启:./mysqld_safe -S /path/to/mysql.sock

3 . 在php等配置文件(如php.ini)中修改指定该socket的配置地址

pdo_mysql.default_socket = /path/to/mysql.sock
mysql.default_socket = /path/to/mysql.sock
mysqli.default_socket = /path/to/mysql.sock

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (111)

问题根源:mysql.sock文件无法通信

问题场景:一般为该mysql.sock文件内容不符合通信的需要

解决方案:跟上面的(2)错误本质上一样,解决方案也一样

参考资料

MySQL技术内幕 InnoDB存储引擎第2版 1.5节 连接MySQL

mysql.sock文件详解:https://blog.csdn.net/kerwin612/article/details/8568206

MySQL 中 mysqld_safe 与 mysqld 区别,以及 mysqld_safe 的使用介绍

https://blog.csdn.net/weixin_30632883/article/details/99563960

MySQL 查看日志

默认mysql 优先读取/etc/my.cnf

1. show variables like '%general_log%';
2. set global log_output='FILE';  // TABLE将会在mysql库下有个日志表
3. my.cnf开启日志:
  a. 在[mysqld]下修改 log_output=FILE
  b. 在[mysqld]下修改 general_log=1
  c. 在[mysqld]下修改 general_log_file=/tmp/t.log

mysql建库

mysql -u root -p -h 10.1.1.1

create schema renren_fast default character set utf8mb4_unicode_ci collate utf8mb4_unicode_ci;
grant select,insert,update,delete,create on renren_fast.* to root;
flush privileges;


3.mysql优化.md

函数优化

GROUP_CONCAT(expr)

FIND_IN_SET(str,strlist)


4.mysql原理解析.md

InnoDB底层原理


Copyright © 2018 INSTALL.REN