mysql

耐心是一切聪明才智的基础。

3范式理解

 字段不可拆分,不冗余,都和id相关。

InnoDB

  • 支持事务,行级锁,外键(外键约束),崩溃恢复。
  • 5.6之后都支持FULLTEXT。
    • 可以创建在char varchar text字段上创建。
    • 类似于like,但是比like快n倍,貌似对中文支持不好。
  • 数据是存于聚集索引,而myisam数据和索引是分开文件存储的,可以更利于压缩,占用更小内存,适用于读插入频繁的操作。

其他数据库区别

  • redis
    内存,提供数据结构类型。(字符,hash,队列,集合, 有序集合)
  • hbase,clickhouse
    列式存储,不用一次把一行的数据加载到内存,更高的压缩率。行式修改比较费时,随机写。所以一般应用于离线大数据分析统计。
  • 芒果db
    文档性数据库,不像关系数据库,列是固定的,修改结构快。
  • es
    对倒排索引lucence的封装,类型mysql中的like,不过这个是专门做全文索引的,高可用,高性能。

表结构设计

  • 最好 非null 给默认值
    https://mp.weixin.qq.com/s/nvBvrHjPojoVez8W2VqjGg
    null也是占空间 。
    null程序逻辑判断 需要判断 要不容易出现 空指针异常。
    不利于索引的优化。
  • 时间类型 datetime 还是 int(百度是i) timeStamp
  • 字段空间 合适 TINYINT 不用 int。
    mybatis用map去接受tinyint数据 长度为1时 会自动转为布尔。。
  • 创建索引。

分库表

  • 统计:主从
  • 千万:
    分表 主要解决 查询问题 一个大树分成多个小树 查询快
    share jdbc(应用) mycat(proxy)
    分库 主要解决并发问题 提高吞度量
  • 硬件方面 普通硬盘 固态硬盘 raid磁盘阵列 提高并发和建立副本

问题排查

  • show processlist 命令查看当前所有连接信息
    show status like '%lock%';# 查询锁状态
    kill SESSION_ID; # 杀掉有问题的session
  • 开启慢查询日志,查看慢查询的 SQL。

buffer pool

  • free链(池外)+ LRU链(池内) = 全量数据

  • flush链(LRU链的子级)记录需要刷新到硬盘的数据,刷新之后,添加到free链里。

  • 判断数据是否在池内,有个数据页缓存哈希表key为表空间id+数据页id,value为缓存地址。

  • 转换过程:
    • 启动时,硬盘数据会存在free链中。
    • 从mysql读数据是 free链->LRU链的过程。
    • 写入mysql 是LRU链节添加到flush链->写入到硬盘->free链的过程。
    • 定时把LRU链上的冷数据回收->free链。
  • 预读机制

分层

  • 服务层
    连接层->词法,语法分析(有缓存走缓存)->
    优化层-> 执行层->
    缓存层(key是SQL语句,value是查询结果,类似于mybatis的二级缓存,all session共享)
  • 存储引擎
    (Innodb,pool buff也算是缓存)

3层最大数据

  • 下一层存储数据条数=上一层最大数据条数*一页数据条数
  • 第一层,一条数据大小按照(8bitint+8索引)16byte来算,一页16kb,所以大约最多存1024条数据。
  • 第二层,存储数据条数=1024\*1024 = 100w
  • 第三层,一条数据大小按照1kb算,一页数据条数就是16.
    存储数据条数=100w\*16 = 1600w

https://juejin.cn/post/6953442154249191454

基数

  • 列的不同值数量,例如性别列的基数为2。
    更新时机是默认大于条数10%时更新。
    值是估算的默认20个数据页抽查。
    可以主动去更新表的基数值。
    默认基数不会持久化,可以开启,提高重启速度。

记录数据插入的过程

  • 1.先锁定写入的数据页,表最大记录的数据页还有位置就用这个数据页,否则就在硬盘上找一个新的数据页。
    2.记录undolog,为提供事务隔离性。
    3.写入页缓存,存上flush链(异步刷新到磁盘,每秒会以一定比例落盘,当redolog不可用,mysql关闭,flush链数据达到一定比例也会触发落盘)。
    4.写入到redologbinlog,写入redolog会有2次提交,第一次会写入状态标记为准备,第二次改为已提交。(两种日志格式个功能不一样,必须保证同步)

change buff

占有pool buff的一部分默认是25%,用于提升二级索引的写入性能。

慢查分析优化

  • 默认long_query_time 是10s,所以一般都是需要调整这个参数。
    5.1之后,可以修改为table模式,会添加到表里记录。
show variables like '%slow%';//查看相关的设置。
show processlist;
mysqldumpslow -s a1 -n 10  mysql.slow_log

优化器,索引,分表
优化器会考虑字段基数。
扫描行数,期望用二级索引,但是考虑到回表可能会直接走主键。
排序倾向于本来有序的字段。

MVCC

  • readView+undolog
    readView在事务开始时生成,当前事务id,活跃事务ids,活跃最小事务ids,下一个事务id。
    undolog记录修改数据记录和事务id绑定。
    事务61事务62同时开启:
    [61, [61,62], 61 , 63]
    [62, [61,62], 61 , 63]
    事务1读id为1的记录,在undolog中有事务60的记录,因为60不在活跃事务里,所以是已经提交的可以直接读。
    事务2修改id为1的记录,undolog中会有事务60,事务62的记录。
    这是事务2没有提交,事务1再次读id为1记录拿到的是事务62的记录,对比在活跃事务里但是比自己大,不能查看,继续找到事务60的记录查看。
    这时候事务62提交了,事务61readview会更新为[61, [61], 61 , 63],再去读undo中事务62的记录,发现不在活跃事务列表里了说明是已经提交的版本,可以查看。

undolog

  • 事务隔离性,以及事务回滚。
    逻辑日志,记录了事务中操作中插入的id,修改和删除字段原值,已备回滚。
    日志格式会记录事务id,下一条undolog位置(形成一个链表),表空间字段值等一些信息。
    默认是共享表空间,可以通过设置单独文件存储,在MySQL5.7中允许用户在线truncate undo log。
    回滚是逻辑回滚。

redolog

  • 崩溃恢复能力。
    innodb引擎为保证持久化,物理层面的,数据页偏移量,关注宕机后如何恢复已提交但是还没有落盘的数据。
    以redoblock(512kb)形式记录,head,tail,body,其中按照事务id进行分组;
    会先写入redologbuff(16M),写入硬盘可以配置参数,innodb_flush_log_at_trx_commit,
    0:每秒落盘一次;
    1:提交就落盘;(默认)
    2:依托os,每秒落盘一次。
    checkpoint记录redolog写入磁盘的位置,如果发生重启,按照checkpoint恢复之后的redolog即可。

binlog

  • 数据备份,恢复,主从。
    逻辑概念,对表做了什么修改,是server层的什么引擎都会记录。
    默认不开启,线上一般都是主从会开启。
    statement,row,maxed3种模式。
    row会比第一种多记录一些信息。
    一般是binlog_row_image=FULL + row格式进行记录,尽量详细记录。
//查看binlog
./mysqlbinlog -vv  --start-position=234 ../var/mysql-bin.000001
//恢复binlog
./mysqlbinlog start-positon=956,stop-position=1230 ../var/mysql-bin.000003 | ./mysql-uroot -p
//开启gtid需要添加
--skip-gtids=true

可以查看对应位置的语句。
gtid记录事务的唯一id,可以根据这个方便主从之间的同步,哪些事务需要同步。
sync_binlog
0 不主动落盘,依赖os的调度。(默认)
1 提交就落盘。(推荐)
n 分组到多少组,一并落盘。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 前言 buffer pool是什么 咱们在使用mysql的时候,比如很简单的select * from table...
    程序员小饭阅读 390评论 0 2
  • 背景,通常情况下,我们为了减少数据库压力一班都会加个缓存机制,先从缓存查,查不到再从数据库查,那么我们的数据库也不...
    名字是乱打的阅读 6,913评论 0 10
  • 当你要执行CRUD操作的时候,无论是查询数据,还是修改数据,实际上都会把磁盘上的数据页加载到缓存页里来,那么在加载...
    香港记者mo阅读 215评论 0 0
  • 设想一下,每次执行一条修改数据库的SQL,数据库都将修改刷新到磁盘,而这些操作是随机IO,效率是非常低的,想想是不...
    虎子讲故事阅读 376评论 0 0
  • 一、InnoDB Buffer Pool简介 Buffer Pool是InnoDB引擎内存中的一块区域,主要用来缓...
    cfanbo阅读 444评论 0 0