自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 MySQL之临时提高性能方法

业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能。如果是无损方案的话,肯定不需要等到这个时候才上场。今天我们就来聊聊这些临时方案,并着重说一说它们可能存在的风险。短连接风暴正常的短连接模式就是连接到数据库后,执行很少的 SQL 语句就断开,下次需要的时候再重连。如果使用的是短连接,在业务高峰期的时候,就可能出现连接数突然暴涨的情况。MySQL 建立连接的过程,成本是很高的。除了正常的网络连接三次握手外,还需要做登录权限判断和获得这个连接的数据读写权限。在

2021-10-29 18:34:56 140

原创 MySQL之上锁规则

这个规则有以下两条前提说明:MySQL 后面的版本可能会改变加锁策略,所以这个规则只限于截止到现在的最新版本,即 5.x 系列 <=5.7.24,8.0 系列 <=8.0.13。因为间隙锁在可重复读隔离级别下才有效,所以本篇文章接下来的描述,若没有特殊说明,默认是可重复读隔离级别。锁的规则加锁规则里面,包含了两个“原则”、两个“优化”和一个“bug”。原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。原则 2:查找

2021-10-29 10:50:06 364

原创 MySQL之幻读问题

首先给出表的创建语句河初始化语句:CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);

2021-10-28 16:42:29 129

原创 MySQL慢查询分析

本篇主要讲解当遇到慢查询时,即使只是查询一行数据,可以使用的一些排查问题的方法需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO 利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于我们今天的讨论范围。为了便于描述,我还是构造一个表,基于这个表来说明今天的问题。这个表有两个字段 id 和 c,并且我在里面插入了 10 万行记录。mysql> CREATE TABLE `t` ( `id` int(11) NOT NUL

2021-10-28 15:17:58 601 1

原创 MySQL之SQL语句性能差异分析

在 MySQL 中,有很多看上去逻辑相同,但性能却差异巨大的 SQL 语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。案例一:条件字段函数操作假设你现在维护了一个交易系统,其中交易记录表 tradelog 包含交易流水号(tradeid)、交易员 id(operator)、交易时间(t_modified)等字段。为了便于描述,我们先忽略其他字段。这个表的建表语句如下:mysql> CREATE TABLE `tradelog` ( `id` int(11) NOT NU

2021-10-28 11:18:39 327

原创 MySQL之order by工作原理2

有一英语学习 App 首页有一个随机显示单词的功能,也就是根据每个用户的级别有一个单词表,然后这个用户每次访问首页的时候,都会随机滚动显示三个单词。现在,如果让你来设计这个 SQL 语句,你会怎么写呢?为了便于理解,对这个例子进行了简化:去掉每个级别的用户都有一个对应的单词表这个逻辑,直接就是从一个单词表中随机选出三个单词。这个表的建表语句和初始数据的命令如下:mysql> CREATE TABLE words (id int(11) NOT NULL AUTO_INCREMENT,wor

2021-10-27 14:48:55 151

原创 MySQL之order by工作原理

在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。假设这个表的部分定义是这样的:CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT NULL,addr varchar(128) DEFAU

2021-10-27 10:48:11 99

原创 MySQL之日志和索引问题补充

日志相关问题讲到 binlog(归档日志)和 redo log(重做日志)配合崩溃恢复的时候,用的是反证法,说明了如果没有两阶段提交,会导致 MySQL 出现主备数据不一致等问题。那么在两段提交的不同瞬间,如果MySQL发生异常重启,如何保证数据完整性呢?再放一次两阶段提交的图,方便学习下面的内容。这里可能有一些误解,这个图不是一个 update 语句的执行流程吗,怎么还会调用 commit 语句?产生这个疑问的原因,是把**两个“commit”**的概念混淆了:“commit 语句”,是指

2021-10-26 15:30:08 87

原创 MySQL之count计数

在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条 select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL 怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。count(*) 的实现方式首先要明确的是,在不同的 MySQL 引擎中,count(*) 有不同的实现方式。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行

2021-10-26 11:40:15 858

原创 MySQL之表数据删除机制

这里,我们还是针对 MySQL 中应用最广泛的 InnoDB 引擎展开讨论。一个 InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以.frm 为后缀的文件里。而 MySQL 8.0 版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。参数 innodb_file_per_table表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:

2021-10-25 19:17:38 285

原创 MySQL之落盘机制

平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。为什么SQL语句变慢了InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log(重做日志),在更新内存写完 redo log 后,就返回给客户端,本次更新成功。找时间把内存里的数据写入磁盘的过程,术语就是 flush。在这个 flush 操作执行之前,内存中的数据和磁盘中的数据是

2021-10-25 14:33:02 1736 1

原创 MySQL之索引4

现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64),…)engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:mysql> select f1, f2 from SUser where

2021-10-23 16:46:06 172

原创 MySQL之索引3

你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:CREATE TABLE t (id int(11) NOT NULL AUTO_INCREMENT,a int(11) DEFAULT NULL,

2021-10-23 14:29:03 86

原创 MySQL之索引2

本篇文章主要讲述普通索引和唯一索引的相关细节,假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = ‘xxxxxxxyyyyyyzzzzz’;所以,你一定会考虑在 id_card 字段上建索引。由于身份证号字段比较大,不建议你把身份证号当做主键,那么现在你有两个选择,要么给 id_card 字段创建唯

2021-10-22 21:32:07 85

原创 MySQL之事务2

如果是可重复读隔离级别,事务 T 启动的时候会创建一个视图 read-view,之后事务 T 执行期间,即使有其他事务修改了数据,事务 T 看到的仍然跟在启动时看到的一样。也就是说,一个在可重复读隔离级别下执行的事务,好像与世无争,不受外界影响。行锁的时候又提到,一个事务要更新一行,如果刚好有另外一个事务拥有这一行的行锁,它又不能这么超然了,会被锁住,进入等待状态。问题是,既然进入了等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值又是什么呢?举一个例子。下面是一个只有两行的表的初始化

2021-10-22 17:00:04 200

原创 MySQL之锁的机制

数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。全局锁全局锁就是对整个数据库实例加锁。MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、

2021-10-20 12:59:25 179

原创 MySQL之入门1

前言以下SQL语句均基于MySQL 5.6+运行登录MySQLmysql -h 127.0.0.1 -u 用户名 -pmysql -D 所选择的数据库名 -h 主机名mysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果mysql> status; # 显示当前mysql的version的各种信息mysql> select version(); # 显示当前mysql的version信息mysql> show global variable

2021-10-20 10:12:27 47

原创 MySQL之索引

索引是数据库里比较重要的概念,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本 500 页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言,索引其实就是它的“目录”。索引常见模型索引的出现是为了提高查询效率,但是实现索引的方式却有很多种,所以这里也就引入了索引模型的概念。可以用于提高读写效率的数据结构很多,这里介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。哈希表哈希表是一种以键 - 值(key-

2021-10-18 16:25:06 111

原创 MySQL之事务1

事务提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这 100 块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在

2021-10-18 11:02:22 107

原创 MySQL之更新语句执行流程2

执行流程从一个简单表开始说起,假设该表有两个字段,一个主键ID和一个整型字段c:mysql> create table T(ID int primary key, c int);把ID为2的行的值加1:mysql> update T set c=c+1 where ID=2;1.整体流程更新语句的执行流程也是差不多的,执行语句前首先连接数据库,由于该语句是更新语句,所以会清空缓存,分析器会通过词法和语法解析知道这是一条更新语句。优化器决定要使用 ID 这个索引。然后,执行器

2021-10-15 22:14:06 131

原创 MySQL之查询语句执行流程1

概述这是MySQL专题的第一讲,在进行学习之前,有必要首先对MySQL有一个整体的认识。使用数据库,百分之90的功能都是查表和改表,其中查表操作更为频繁,所以本文首先从查询语句这一角度入手来进行MySQL的学习。在后面的章节中会划分成以下几个部分进行学习,其中会穿插着常见面试题和场景分析题:存储引擎索引锁事务执行流程假设有一个简单的表,只有一个ID字段,我通过以下查询语句来分析其执行过程:mysql> select * from T where ID=10;1.整体框架

2021-10-14 20:24:17 159

原创 HashMap源码分析

HashMap本文的主要分析对象是基于JDK1.8进行HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap 可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个本文对HashMap的源码分析主要根据以下方面:底层实现构造方法get方法put方法扩容机制常用操作线程安全版本变化(与1.7比较)其他底层实现1.底层实现HashMap的底层实现是数

2021-10-12 22:19:14 113

原创 LinkedList源码分析

LinkedListLinkedList是一个实现了List接口和Deque接口的双端链表。 LinkedList底层的链表结构使它支持高效的插入和删除操作,另外它实现了Deque接口,使得LinkedList类也具有队列的特性; LinkedList不是线程安全的,如果想使LinkedList变成线程安全的,可以调用静态类Collections类中的synchronizedList方法: List list = Collections.synchronizedList(new LinkedList&l

2021-10-11 20:49:45 107

原创 ArrayList源码分析

ArrayListArrayList 的底层是数组,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。本文会从以下几个方面来堆ArrayList进行分析说明:底层实现构造函数常用操作扩容机制线程安全其他当然后面还会总结出有关ArrayList的面试题,包括和Vector进行比较等等相关问题简介ArrayList继承于 AbstractList ,实现了 List, RandomAccess, Cloneable, java.io.Serializable 这些接口。p

2021-10-11 19:27:23 32

原创 设计模式之学习1

设计模式什么情况才会使用设计模式

2021-09-23 09:54:36 43

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除