MySQL 简介

image.png

一 架构

mysql架构图

MySQL的架构实现主要可以分成三层:接入层,服务层,引擎层

  • 接入层负责网络连接管理,授权认证等功能,包括 SSL 加密任务,也是在此完成。

  • 服务层。服务层大致上可以分成查询接口,查询优化器,解释器几个部件


    服务层组件
  • 引擎层。
    引擎层负责数据的提取和存取,这里实现了各种查询数据接口,多线程事务,并发逻辑等等。
    层与层之间通过 API联系。因此,我们称之为层。

大致上一个 查询动作通过网络请求到达 mysql服务器以后,在连接层进行鉴权,服务层将 sql解析优化,最后调用引擎层的api执行数据查找,查找结果通过 网络回传回客户端

  • 存储层。操作系统的文件管理 ,一些 IO 逻辑

二 引擎

2.1 MyISAM
frm文件:存储表的定义数据
MYD文件:存放表具体记录的数据
MYI文件:存储索引
2.2 InnoDB
-可以通过自动增长列,方法是auto_increment。

  • 支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
  • 使用的锁粒度为行级锁,可以支持更高的并发;
  • 支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
  • 配合一些热备工具可以支持在线热备份;
  • 在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
  • 对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;
    2.3 Memory
    将数据存在内存,为了提高数据的访问速度,每一个表实际上和一个磁盘文件关联。文件是frm。
    支持的数据类型有限制,比如:不支持TEXT和BLOB类型,对于字符串类型的数据,只支持固定长度的行,VARCHAR会被自动存储为CHAR类型;
    支持的锁粒度为表级锁。所以,在访问量比较大时,表级锁会成为MEMORY存储引擎的瓶颈;
    由于数据是存放在内存中,一旦服务器出现故障,数据都会丢失;
    查询的时候,如果有用到临时表,而且临时表中有BLOB,TEXT类型的字段,那么这个临时表就会转化为MyISAM类型的表,性能会急剧降低;
    默认使用hash索引。
    如果一个内部表很大,会转化为磁盘表。

数据库之范式和反范式

索引

索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。

B树只适合随机检索,适合文件操作,B+树同时支持随机检索和顺序检索
B+树的磁盘读写代价更低, B+树的内部结点并没有指向关键字具体信息的指针
B+树的查询效率更加稳定。B树搜索有可能会在非叶子结点结束
只要遍历叶子节点就可以实现整棵树的遍历,数据库中基于范围的查询是非常频繁,B树这样的操作效率非常低

3.1 聚集索引
B+ 树索引按照存储方式的不同分为聚集和非聚集索引,聚集索引在叶子节点存储数据,非聚集索引在叶子节点存储的是健值和主键,默认是在主键上建立聚集索引,下图以B+树为例:


聚集索引查询示意图

3.2 非聚集索引
其实按照定义,除了聚集索引以外的索引都是非聚集索引,只是人们想细分一下非聚集索引,分成普通索引,唯一索引,全文索引。如果非要把非聚集索引类比成现实生活中的东西,那么非聚集索引就像新华字典的偏旁字典,他结构顺序与实际存放顺序不一定一致。
使用非聚集索引查询,而查询列中包含了其他该索引没有覆盖的列,那么他还要进行第二次的查询,查询节点上对应的数据行的数据。

覆盖索引 查询字段在索引上即为覆盖索引,查询索引里的列的数据而不需要进行回表二次查询,如index(col1, col2),执行下面的语句

关于看join

INNER JOIN
LEFT JOIN(左连接)
RIGHT JOIN (右连接)
MySQL 使用了嵌套循环(Nested-Loop Join)的实现方式。Nested-Loop Join需要区分驱动表和被驱动表,先访问驱动表,筛选出结果集,然后将这个结果集作为循环的基础,访问被驱动表过滤出需要的数据。Nested-Loop Join分下面几种类型:

SNLJ,简单嵌套循环。这是最简单的方案,性能也一般。 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。
如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。

优化
小结果集驱动大结果集。用数据量小的表去驱动数据量大的表,这样可以减少内循环个数,也就是被驱动表的扫描次数。
用来进行 join 的字段要加索引,会触发 INLJ 算法,如果是主键的聚簇索引,性能最优。
例子:第一个子查询是72075条数据,join的第二条子查询是50w数据,主要的优化还是驱动表是小表,后面的是大表,on的条件加上了唯一索引。

SQL 优化


遵循索引原则适合大部分的常规数据库查询场景,但不是所有的索引都能符合预期,从索引原理本身来分析对索引的创建会更有帮助。

小表的全表扫描往往会比索引更快
中大型表使用索引会有很大的查询效率提升
超大型表,索引也无法解决慢查询,过多和过大的索引会带来更多的磁盘占用和降低INSERT效率

image.png

慢查询分析
explain + show profile

不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

IO瓶颈
第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表。

第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库。

CPU瓶颈
第一种:SQL问题,如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作 -> SQL优化,建立合适的索引,在业务Service层进行业务计算。

第二种:单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈 -> 水平分表。

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

推荐阅读更多精彩内容