mysql
文章平均质量分 82
ruirui_6
这个作者很懒,什么都没留下…
展开
-
MYSQL45讲学习笔记
23 | MySQL是怎么保证数据不丢的?之前我们学习了MYSQL的WAL技术,以及 redo log 和 binlog , redo log 保证 crash-safe 功能,binlog 保证数据库可以恢复到某一时刻的状态,那么MYSQL怎样可以保证数据不丢失?答案就是:只要 redo log 和 binlog 不丢失,就可以保证 MYSQL 数据不丢失。binlog 写入机制binlog 的写入逻辑比较简单,先将 binlog 日志写入 biglog cache,在事务提交时,再将 b原创 2021-08-26 08:58:45 · 110 阅读 · 0 评论 -
MYSQL45讲学习笔记
22 | MySQL有哪些“饮鸩止渴”提高性能的方法?我们在实际开发中可能会遇到这种情况:业务高峰期,MYSQL压力较大,客户端长时间没有收到响应。这时可能需要一些短时间内提高性能的方法,让业务功能暂时恢复。短连接风暴短连接模式就是在连接上MYSQL之后,执行很少的SQL语句就重连,下次需要再重连。如果使用的是短连接,在业务高峰期,连接数可能会激增。MYSQL连接的成本是相当高的,除了网络的三次握手之外,还需要做登录权限验证和读写权限验证,在数据库压力比较小的时候,这些额外的原创 2021-08-22 20:47:43 · 154 阅读 · 0 评论 -
MYSQL45讲学习笔记
20.幻读是什么,幻读有什么问题?本节我们还是建一张表,依据这张表来说明问题。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,1原创 2021-08-18 22:12:38 · 114 阅读 · 0 评论 -
MYSQL45讲学习笔记
19.为什么我只查一行的语句,也执行这么慢?一般情况下,如果查询的数据量非常大,或者SQL语句非常复杂,那么可能SQL执行的时间会比较长。但是如果只查一条记录,SQL语句执行也非常慢呢?当然如果系统CPU使用率过高,或者数据库IO压力很大, 也会造成SQL语句执行慢,以上几种场景不在本节讨论范围内。为了方便说明,我们还是创建一张表,基于这张表来说明今天的问题。CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAUL..原创 2021-08-11 21:10:38 · 132 阅读 · 0 评论 -
MYSQL45讲学习笔记
17.如何正确的展示随机消息?假设现在有一张英语单词表定义如下CREATE TABLE `words` ( `id` int(11) NOT NULL AUTO_INCREMENT, `word` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;delimiter ;;create procedure idata()begin declare i int; set i=0; while i&l原创 2021-08-09 22:32:40 · 87 阅读 · 0 评论 -
MYSQL45讲学习笔记
16.order by 是怎么工作的相信大家在日常开发中,经常会遇到一些需要排序的业务,以一个市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄。假设市民表定义如下:create table t(id int AUTO_INCREMENT,name varchar(20),age varchar(3),city varchar(10),addr varchar(120),primary key ('id'),key 'id...原创 2021-08-04 22:35:59 · 70 阅读 · 0 评论 -
MYSQL45讲学习笔记
前言:此博客为本人学习课程之后反思复盘之用,如有错误之处,还请您指正, 文章若有侵权之处,也请您联系我删除。14.count(*)这么慢,我该怎么办?相信大家在开发中,经常会遇到需要查询表记录总数的场景。刚开始,表的记录比较小,随着业务量的增长,表的记录总数会越来越大,我们会发现,count(*)会越来越慢。不同引擎count(*)实现方式MYSQL原生的引擎MYISAM,因为不支持事务和不支持mvcc的原因,所以可以将每张表的记录总数存在引擎里,因此MYISAM执行count(*)非常快,原创 2021-08-02 23:36:05 · 69 阅读 · 0 评论 -
MYSQL45讲学习笔记
13.为什么表数据删掉一半,表文件大小不变?表结构文件在MYSQL8.0以前, 表结构文件存放在一个.frm后缀的文件里;在MYSQL8.0之后,已经允许表结构文件与表数据文件一起存放。因为表结构文件占用空间很小,所以我们主要关注表数据文件。表数据文件与innodb_file_per_table说到表数据文件,我们必须说说innodb_file_per_table这个参数,当值为ON时,表示表数据文件单独存放在 .ibd 后缀的文件中,如果我们使用drop table 命令,那么系统会删原创 2021-07-30 09:12:00 · 71 阅读 · 0 评论 -
MYSQL45讲学习笔记
12.为什么我的MYSQL会“抖”一下?有时候我们会发现平时执行很快的SQL语句,突然变的很慢,这有可能是MYSQL在flush脏页。MYSQL flush脏页有四种场景:1.redo log写满了,write pos将要追上check point。2.内存不够用了,需要淘汰一部分脏页。3.MYSQL后台线程认为系统有足够的IO能力时,刷一部分脏页到磁盘。4.MYSQL正常关闭时,会将所有的脏页刷新到磁盘。这四种场景中,后两种场景对于性能没有太大影响,我们重点关注前两种场景。原创 2021-07-29 13:41:21 · 48 阅读 · 0 评论 -
MYSQL45讲学习笔记
11.如何给字符串字段加索引在日常开发中,我们有时会用到字符串字段来做条件查询,如果字符串字段上没有索引,则会走全表扫描。但是如果建立一个全字段索引,可能会导致索引占用的空间较大,消耗CPU资源,影响性能,那么我们应该如何给字符串字段加索引?1.使用前缀索引例如现在有一个用户表里有邮箱字段:email,要给这个字段加索引,我们应该怎么加?对于区分度越大的字段,越能体现索引的优势,因为邮箱字段后面的"@xxxx.com"区分度不大,所以我们可以建立一个前缀索引,例如:alter ..原创 2021-07-28 22:57:02 · 196 阅读 · 0 评论 -
MYSQL45讲学习笔记
10.MYSQL为什么有时候会选错索引前言:如果您阅读本文之后,有觉得不妥当的地方,请您留下宝贵的意见。前面我们学习过,优化器的工作是选择合适的索引,使执行器可以以最小的代价执行SQL语句。但是有时候MYSQL因为种种原因,也会选错索引。其实就是MYSQL的bug,不同的版本有不同的处理方式。1.MYSQL索引的基数-cardinalityMYSQL通过采样的方式来获取索引的区分度,也叫做索引的基数。如果一列的值域范围很广,那么我们称这一列的索引区分度很高,如果一列的值域范围很窄,(比如:性原创 2021-07-27 22:57:14 · 55 阅读 · 0 评论 -
MYSQL45讲学习笔记
09 普通索引和唯一索引,怎么选择?以select id from T where k=5为例,假设id为主键,k上有普通索引或者唯一索引。1.普通索引和唯一索引的查询过程首先查询索引,找到叶子结点中k=5的数据页,将其加载进内存。普通索引:查询到k=5的行之后,继续查找下一行,直到碰到第一个k不为5的行唯一索引:查询到k=5的行,直接返回。两者的不同之处在于,普通索引多了一个“查询和判断下一行的记录”,这个操作对于性能影响微乎其微,因为mysql加载数据是将页加载进原创 2021-07-26 23:09:47 · 87 阅读 · 0 评论 -
MYSQL45讲学习笔记
7.行锁功过MYSQL的行锁是引擎层的,由各个引擎来实现,InnoDB支持行锁,而MYSQL原生的存储引擎MyISAM不支持行锁,也不支持事务,这是它被InnoDB取代的一个重要原因。首先行锁是添加在索引上,如果where关键字后面的列没有索引,那么会导致锁表。两阶段锁行锁在需要用到的时候会被获取,但是并不会立刻释放,而是在事务提交的时候释放,这就是两阶段锁。如图所示,假设id为表T主键,那么上图的事务会有什么结果?事务B的操作会被阻塞,等待事务A commit之后才会执行.原创 2021-07-21 20:55:00 · 61 阅读 · 0 评论