mysql性能优化的设计和选择

mysql我们最常用的操作,无非是查询、更新和新增记录,那么mysql关于这些操作,从架构设计到底层数据结构,都做了什么呢?

mysql分为server层和存储引擎层,Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。我们接下来的讨论皆是在innoDB的前提下。

关于查询,我们知道索引的出现,可以帮助我们快速定位到我们所需的数据,提高我们的读写效率,索引的实现有很多种,

比如哈希表,有序数组,搜索树等等,哈希表我们可以通过对特定的hash函数把key转化为一个确定的位置,从而迅速查找到我们所需的数据,

不可避免的由于hash冲突的存在,导致不同的key出现同一个值的情况,进而出现链表以解决这种情况

由于数据的无序,所以当出现范围查询的需求时,hash表的表现并不尽如人意,仅适用于等值查询的情况


hash表

有序数组的等值查询和范围查询都非常优秀,可以通过二分法迅速找到所需数据,如果是范围查询,由于是有序的,所以只需继续往后或

往前遍历即可,但是由于我们的数据库,是会经常发生数据的更新的,有序数组的更新,需要挪动改动位置后的所有数据,成本太高。


有序数组

二叉树的特征是每个节点大于左节点而小于右节点,查询和更新都很快。然而因为索引不仅写在内存中,还需要写在磁盘中,在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,由于二叉树只有2个分叉,导致这棵树会长得很高进而导致我们的查询次数增多,所以N叉树应运而生,假如N是1000,那么

一颗高为4的树,就能够容纳1000的3次方,10亿的数据,查询一个值访问磁盘的次数最多也就3次(因为根节点一般在内存中常驻)

N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了

不管是哈希还是有序数组,或者 N 叉树,它们都是不断迭代、不断优化的产物或者解决方案。数据库技术发展到今天,跳表、LSM 树等数据结构也被用于引擎设计中,这里我就不再一一展开了。


二叉搜索树

接下来我们探讨一下innodb关于数据更新做了什么优化。

在我们小时候,我们去村里的小卖部,经常会看到小卖部里面有一块小黑板,上面记录了某某某年某月某日赊了多少钱的账,你想想,小卖部

一般就店老板夫妻两个人,最多孩子放假的时候来帮忙,每天的买卖高峰期是很忙的,如果某个人来赊账了,是不可能临时跑到楼上的房间从

层层被褥中找出那本小账本,然后再一页一页翻出那个人的欠账历史记录再去算出加上今天他总共欠我多少钱,太慢了,通常的做法是立马在

小黑板随手记一笔某某的欠账记录,等到夜深人静关店的时候,再拿出小账本对照小黑板更新一波赊账记录,

映射到mysql,这叫做WAL技术,Write-Ahead Logging,它的关键点就是先写日志,再写磁盘,也就是先写小黑板,等不忙的时候再写账本。

因为磁盘的随机读写,是非常慢的,相较于内存的读写,速度上有几十万倍的差距,我们不可能慢吞吞的去磁盘找到那条数据然后再更新,

mysql中的小黑板,叫做redolog,所以总而言之,mysql关于数据更新是这样做的,先在内存中的一块叫做redolog的缓冲区中先记录

‘某某记录修改成为了什么‘,从逻辑上理解,我们可以把redolog当成一个环,有两个指针,一个指向写到哪了,一个指向更新到哪了,

mysql后台再慢慢的把缓冲区里面的东西更新到磁盘及redolog的物理日志,redolog还可以和binlog通过

两阶段提交从而达到crash-safe的能力,保证在数据库突然挂掉的情况下恢复数据,这里就不拓展了。


redolog

无独有偶,mysql关于数据更新还有个小优化,我们知道索引有唯一索引和非唯一索引,在更新上的区别就是,更新唯一索引需要比

更新非唯一索引多一个步骤,就是判断我更新之后的唯一性。对于普通索引而言,我们可以通过chage buffer从而提升我们的更新效率,

通常的更新流程这这样的,我们需要去磁盘里把数据读到内存,再做更新,然后再写回到磁盘,由前面可知,磁盘的操作是数据库中成本最高的操作之一,会大大降低我们的效率,所以我们要尽可能避免磁盘的操作,change buffer是一块专门用来记录数据变更的内存,当需要更新

某条记录时,只需在change buffer中记录即可,当change buffer存到一定量或者某条只存在change buffer不在磁盘中的数据被访问到

时,需要通过merge操作完成真正的数据更新。

因为 merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做 merge 之前,change buffer 记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。

因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。这种业务模型常见的就是账单类、日志类的系统。

总而言之,redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。

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

推荐阅读更多精彩内容