Scott's world.

Scott's world.

从来如此,便对吗

MySQL-count(*)笔记
MySQL-count(*)笔记在开发的时候我们可能会经常碰到计算一个表的行数的需求 这时候我们一般都会使用select count(*) from t 但是我们后面会发现随着记录数越来越多,这条语句执行的也会越来越慢,而为什么会出现这样的情况呢,很明显问题就出在count(*) 所以我们这次就来学习一下count(*)语句到底是如何实现,以及为什么MySQL会这么实现,说完了原理我们就再来说一下如果应用中有这种频繁变更并需要统计表行数的需求,业务设计上可以怎么实现 count(*)的实现方式在不同的MySQL引擎中,count(*)有不同的实现方式。 MyISAM引擎是把一个表总行数...
MySQL-删表陷阱相关笔记
MySQL-删表陷阱相关笔记有时候我们不会碰到这样一个问题 我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,为什么表文件的大小还是没有变化 这次我们就来讨论如何解决这样一个问题,讲述删除表操作中的相关知识 也就是数据库表的空间回收问题 我们以MySQL中常见的InnoDB引擎展开讨论 InnoDB表包含两部分 结构定义 数据 在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。 因为表结构定义占用的空间很小,所以我们今天主要讨论的是表数据。 回到问题本身,即简单地删除表数据达不到表空...
C语言-字符串
C语言-字符串什么是字符串 字符串(character string) 一个或多个字符的序列称为字符串 C语言中形如 “My heart is still.” 双引号不是字符串的一部分,仅用来告知编译器括起来的是字符串 注意: 空字符不要和NULL混淆 空字符是字符串的终止符,而NULL是一个 符号,表示不引用任何内容的内存地址 C语言中的字符串 使用字符数组存储 使用字符数组存放字符串 12345678#include <stdio.h> void main() { char name1[8] = {'J', 'a', '...
缓存策略和缓存故障
缓存策略和缓存故障缓存策略能应用在很多需要提高系统性能的地方 我们引入缓存,通过缓存数据,而当从缓存里面存取数据即更新数据的时候,速度可以显著提高,当然在缓存数据之后还要考虑如何安全地同步到数据源 而缓存策略就是为了解决这一问题而出现的 下面我们会见到几种最常见的缓存策略,分别介绍他们的优缺点和使用场景 Cache-Aside Read-Through Write-Through Write-Behind 同时我也会通过Redis出现介绍经常出现的缓存故障\ Redis雪崩 缓存击穿 缓存穿透 Cache-AsideCache-Aside应该是我们最常见也最常用的缓存策略. 在这...
MySQL-脏页相关笔记
MySQL-脏页相关笔记回顾前面我们提到的WAL(write ahead logging)机制 即InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作redo log(重做日志) 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。 不论是脏页还是干净页,都在内存中。 每个数据页头部有LSN,8字节,每次修改都会变大。 对比这个LSN跟checkpoint 的LSN,比checkpoint小的一定是干净页 在我们平常执行相关的更新操作,其实就是在写内存和日志,而偶尔我...
MySQL-选取字符串索引笔记
MySQL-选取字符串索引笔记假如现在我们要在数据库中查询邮箱号这种具有标识型的字符串数据 我们在前面知道若不加索引则这个查询语句就会进行全表扫描 所以下面我们就来看一下如何给字符串添加索引,提高查询效率 前缀索引MySQL支持前缀索引,即可以定义字符串的一部分作为索引,若创建索引不指定字符串长度就默认为整个字符串的长度 而指定了长度和没有指定长度的区别就在于指定长度的索引占用的空间会更小 但是带来的损失就可能会增加额外的记录扫描次数 假如现在我们进行一个查询语句 1select id,name,email from SUser where email='zhangssxyz@...
C语言-指针与一维数组
C语言-指针与一维数组为什么引入指针的概念? 指针有如下好处: 为函数提供修改变量值的手段 为C的动态内存分配系统提供支持 可以改善某些子程序的效率 为动态数据结构(如例链表、队列、二叉树等)提供支持 指针定义:指针是一个值为内存地址的变量(或数据对象) 注意:指针的本质在于它只是一个变量,特殊在于它存的值是内存地址 声明及初始化指针变量 基本用法 数据类型 * 指针变量名; 1234int * ptr_num;char * ptr_name;float * ptr_money;double * p_price; 注意: 在头文件中,NULL被定义为常量 即...
MySQL-错误选择索引笔记
MySQL-错误选择索引笔记 当我们在开启没有sessionA之前,进行 select * from t where a between 10000 and 20000; 其用explain命令可以看到,优化器选择了索引a,且查询行数也在10000左右 在开始了sessionA并在未提交之前执行sessionB,其中idata的作用是往表里面插入10万行数据 这时候,sessionB的查询语句就不会在选择索引a了,我们可以通过慢查询日志(slow log)来查看一下具体的执行情况 若执行下面三个语句来进行一个实验 123set long_query_time=0; /*将慢查询日志的阈...
MySQL-普通索引与唯一索引笔记
MySQL-普通索引与唯一索引笔记在前面我们已经接触过了索引的基本概念,也了解了什么是唯一索引和普通索引的区别。 今天这篇文章,就主要来谈谈在更具体的业务场景中,应该选择唯一索引还是普通索引? 下面在业务代码已经保证了不会写入两个重复数据,我们来讨论着两种索引对查询语句和更新语句的性能影响来进行分析 查询过程查询语句是在索引树上查找的过程,先是通过B+树从树根开始,树层索引到叶子节点,也就是数据页,然后可以认为数据页内部通过二分法来定位记录。 对于普通索引,查找到满足条件的第一个记录之后,需要查找下一个记录,直到碰到第一个不满足查询条件的记录 对于唯一索引,由于索引定义了唯一性,查找到...
MySQL-详解事务隔离笔记
MySQL-详解事务隔离笔记在前面我们也提到过事务隔离 事务隔离中有一个可重复读隔离级别,事务启动的时候会创建一个视图read-view,之后执行期间如果有其他事务修改了数据,那么该事务看到的还是和启动时看到的一样,但是这其中仍然有很多细节值得我们去推敲 比如在上一篇中提到了行锁的概念,那么在另一个事务拥有行锁的时候,其他想要操作该行的事务就会被锁住,进入等待状态,问题是进入等待状态,那么等到这个事务自己获取到行锁要更新数据的时候,它读到的值是先前拥有行锁更新后的值还是更新前的值呢 现在我们通过一个例子来了解这一过程 123456mysql> CREATE TABLE `t` ( ...
avatar
Scott
L'enfer, c'est les autres
FRIENDS