一、 数据库性能优化的意义

业务发展初期,数据库中量一般都不高,也不太容易出一些性能问题或者出的问题也不大,但是当数据库的量级达到一定规模之后,如果缺失有效的预警、监控、处理等手段则会对用户的使用体验造成影响,严重的则会直接导致订单、金额直接受损,因而就需要时刻关注数据库的性能问题。

二、性能优化的几个常见措施

数据库性能优化的常见手段有很多,比如添加索引、分库分表、优化连接池等,具体如下:

物理级别 :提升硬件性能

将数据库安装到更高配置的服务器上会有立竿见影的效果,例如提高 CPU 配置、增加内存容量、采用固态硬盘等手段,在经费允许的范围可以尝试。

应用级别:连接池参数优化

我们大部分的应用都是使用连接池来托管数据库的连接,但是大部分都是默认的配置,因而配置好超时时长、连接池容量等参数就显得尤为重要:

单表级别:合理运用索引

如果数据量较大,但是又没有合适的索引mysql获取当前时间,就会拖垮整个性能,但是索引是把双刃剑,并不是说索引越多越好,而是要根据业务的需要进行适当的添加和使用。缺失索引、重复索引、冗余索引、失控索引这几类情况其实都是对系统很大的危害。

库表级别:分库分表

当数据量较大的时候,只使用索引就意义不大了,需要做好分库分表的操作,合理的利用好分区键,例如按照用户 ID、订单 ID、日期等维度进行分区,可以减少扫描范围。

监控级别:加强运维

针对线上的一些系统还需要进一步的加强监控,比如订阅一些慢 SQL 日志,找到比较糟糕的一些 SQL,也可以利用业务内一些通用的工具,例如 druid 组件等。

三、MySQL 底层架构

首先了解一下数据的底层架构,也有助于我们做更好优化。

mysql 获取当前毫秒_mysql获取当前时间毫秒_mysql获取当前时间

一次查询请求的执行过程:

我们重点关注第二部分和第三部分,第二部分其实就是 Server 层,这层主要就是负责查询优化,制定出一些执行计划,然后调用存储引擎给我们提供的各种底层基础 API,最终将数据返回给客户端。

四、MySQL 索引构建过程

目前比较常用的是 InnoDB 存储引擎,本文讨论也是基于 InnoDB 引擎。我们一直说的加索引,那到底什么是索引、索引又是如何形成的呢、索引又如何应用呢?这个话题其实很大也很小,说大是因为他底层确实很复杂,说小是因为在大部分场景下程序员只需要添加索引就好,不太需要了解太底层原理,但是如果了解不透彻就会引发线上问题,因而本文平衡了大家的理解成本和知识深度,有一定底层原理介绍,但是又不会太过深入导致难以理解。

首先来做个实验:创建一个表,目前是只有一个主键索引。

CREATE TABLE `t1`(a int NOT NULL,b int DEFAULT NULL,c int DEFAULT NULL,d int DEFAULT NULL,e varchar(20) DEFAULT NULL,PRIMARYKEY(a))ENGINE=InnoDB

插入一些数据:

insert into test.t1 values(4,3,1,1,'d');insert into test.t1 values(1,1,1,1,'a');insert into test.t1 values(8,8,8,8,'h');insert into test.t1 values(2,2,2,2,'b');insert into test.t1 values(5,2,3,5,'e');insert into test.t1 values(3,3,2,2,'c');insert into test.t1 values(7,4,5,5,'g');insert into test.t1 values(6,6,4,4,'f');

MYSQL 从磁盘读取数据到内存是按照一页读取的,一页默认是 16K,而一页的格式大概如下。

mysql 获取当前毫秒_mysql获取当前时间毫秒_mysql获取当前时间

每一页都包括了这么几个内容,首先是页头、其次是页目录、还有用户数据区域。

1、刚才插入的几条数据就是放到这个用户数据区域的,这个是按照主键依次递增的单向链表。

2、页目录这个是用来指向具体的用户数据区域,因为当用户数据区域的数据变多的时候也就会形成分组mysql获取当前时间,而页目录就会指向不同的分组,利用二分查找可以快速的定位数据。

当数据量变多的时候,那么这一页就装不下这么多数据,就要分裂页,而每页之间都会双向链接,最终形成一个双向链表。

页内的单向链表是为了查找快捷,而页间的双向链表是为了在做范围查询的时候提效,下图为示意图,其中其二页和第三页是复制的第一页,并不真实。

mysql 获取当前毫秒_mysql获取当前时间毫秒_mysql获取当前时间

而如果数据还继续累加,光这几个页也不够了,那就逐步的形成了一棵树,也就是说索引 B-Tree 是随着数据的积累逐步构建出来的。

mysql获取当前时间_mysql 获取当前毫秒_mysql获取当前时间毫秒

最下边的一层叫做叶子节点,上边的叫做内节点,而叶子节点中存储的是全量数据,这样的树就是聚簇索引。一直有同学的理解是说索引是单独一份而数据是一份,其实 MySQL 中有一个原则就是数据即索引、索引即数据,真实的数据本身就是存储在聚簇索引中的,所谓的回表就是回的聚簇索引。

但是我们也不一定每次都按照主键来执行 SQL 语句,大部分情况下都是按照一些业务字段来,那就会形成别的索引树,例如,如果按照 b,c,d 来创建的索引就会长这样。

推荐 1 个网站,可以可视化的查看一些算法原型:

目录:

~galles/visualization/Algorithms.html

B + 树:

~galles/visualization/BPlusTree.html

而在 MySQL 官网上介绍的索引的叶子节点是双向链表。

对于 B-Tree 而言,叶子节点是没有链接的,而 B+Tree 索引是单向链表,但是 MySQL 在 B+Tree 的基础之上加以改进,形成了双向链表,双向的好处是在处理 >

限时特惠:本站每日持续更新海量设计资源,一年会员只需29.9元,全站资源免费下载
站长微信:ziyuanshu688