MySQL基于规则的优化(关于子查询优化二三事儿)
MySQL基于规则的优化(关于子查询优化二三事儿)设计 MySQL 的大叔依据一些规则,竭尽全力的把很糟糕的语句转换成某种可以比较高效执行的形式,这个过程也可以被称作 查询重写
条件化简移除不必要的括号有时候表达式里有许多无用的括号,比如这样:
((a = 5 AND b = c) OR ((a > c) AND (c < 5)))
看着就很烦,优化器会把那些用不到的括号给干掉,就是这样:
(a = 5 and b = c) OR (a > c AND c < 5)
常量传递(constant_propagation)有时候某个表达式是某个列和某个常量做等值匹配,比如这样:
a = 5
当这个表达式和其他涉及列 a 的表达式使用 AND 连接起来时,可以将其他表达式中的 a 的值替换为 5 ,比如这样:
a = 5 AND b > a
就可以被转换为:
a = 5 AND b > 5
用OR连接起来的表达式就不能进行常量传递
等值传递(equality_propagation)有时候多个列之间存在等值匹配的关系,比如这样:
a = b ...
MySQL InnoDB的统计数据
InnoDB统计数据是如何收集的两种不同的统计数据存储方式InnoDB 提供了两种存储统计数据的方式:
永久性的统计数据
统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。
非永久性的统计数据
统计数据存储在内存中,当服务器关闭时这些这些统计数据就都被清除掉了,等到服务器重启之后,在某些适当的场景下才会重新收集这些统计数据。
控制到底采用哪种方式去存储统计数据
系统变量: innodb_stats_persistent
在MySQL 5.6.6 之前, 值默认是OFF, 也就是说 InnoDB 的统计数据默认是存储到内存的。 之后的版本中innodb_stats_persistent 的值默认是ON ,也就是统计数据默认被存储到磁盘中。
InnoDB 默认是以表为单位来收集和存储统计数据的,也就是说我们可以把某些表的统计数据(以及该表的索引统计数据)存储在磁盘上,把另一些表的统计数据存储在内存中。
可以在创建和修改表的时候通过指定STATS_PERSISTENT 属性来指明该表的统计数据存储方式:
CREATE TABLE 表名 (...) Engine=Inn ...
ffmpeg 入门
前置视频和图片相关的基础知识基础概念分辨率:
视频或图片的尺寸,通常用宽度和高度表示(例如1920x1080)。
常见分辨率:480p(SD),720p(HD),1080p(Full HD),4K,8K。
帧率(Frame Rate):
视频每秒播放的帧数,通常用fps(frames per second)表示。
常见帧率:24fps、30fps、60fps。
比特率(Bit Rate):
视频或音频每秒传输的数据量,通常用kbps(kilobits per second)表示。
比特率越高,质量越好,但文件也更大。
编解码器(Codec):
用于压缩和解压视频或音频的算法。
常见视频编解码器:H.264、H.265、VP9。
常见音频编解码器:AAC、MP3、Opus。
容器格式(Container Format):
用于存储视频、音频、字幕等数据的文件格式。
常见容器格式:MP4、AVI、MKV、MOV。
颜色空间:
颜色信息的表示方式,如RGB、YUV。
不同的颜色空间适用于不同的应用场景。
图片处理基础图片格式:
常见图片格式:JPEG、PNG、BMP ...
快速排序 & 堆排序 & 桶排序
快速排序 & 快速选择基准点的选取
基准点(pivot)是快速选择和快速排序算法中的一个关键概念。基准点的选取方法可以有很多种,常见的策略包括:
固定基准点:通常选择数组的第一个元素或最后一个元素作为基准点。
随机基准点:随机选择数组中的一个元素作为基准点。
三数取中:选择数组的第一个元素、最后一个元素和中间元素的中值作为基准点。
基准点的选取会影响算法的性能。如果每次选取的基准点都能将数组近似平分,那么快速排序的性能会更好。
逆序和正序的区别
在快速选择和快速排序算法中,逆序和正序的主要区别在于分区过程中比较和交换的方向。
正序排序
正序排序是指从小到大排序。在分区过程中,目标是将所有小于基准点的元素放在基准点的左侧,将所有大于基准点的元素放在基准点的右侧。
具体步骤如下:
从左向右找到第一个大于等于基准点的元素。
从右向左找到第一个小于等于基准点的元素。
交换这两个元素。
重复上述步骤直到左右指针相遇。
逆序排序
逆序排序是指从大到小排序。在分区过程中,目标是将所有大于基准点的元素放在基准点的左侧,将所有小于基准点的元素放在基准点的右侧。
具体步骤如下:
从 ...
MySQL基于成本的优化
MySQL基于成本的优化什么是成本MySQL 执行一个查询可以有不同的执行方案,它会选择其中成本最低,或者说代价最低的那种方案去真正的执行查询。不过我们之前对 成本 的描述是非常模糊的,其实在 MySQL 中一条查询语句的执行成本是由下边这两个方面组成的:
I/O 成本
我们的表经常使用的 MyISAM 、 InnoDB 存储引擎都是将数据和索引都存储到磁盘上的,当我们想查询表中的记录时,需要先把数据或者索引加载到内存中然后再操作。这个从磁盘到内存这个加载的过程损耗的时间称之为 I/O 成本。
CPU 成本
读取以及检测记录是否满足对应的搜索条件、对结果集进行排序等这些操作损耗的时间称之为 CPU 成本。
对于 InnoDB 存储引擎来说,页是磁盘和内存之间交互的基本单位,设计 MySQL 的大叔规定读取一个页面花费的成本默认是 1.0 ,读取以及检测一条记录是否符合搜索条件的成本默认是 0.2 。 1.0 、 0.2 这些数字称之为 成本常数 ,这两个成本常数我们最常用到。
需要注意的是,不管读取记录时需不需要检测是否满足搜索条件,其成本都算是0.2。
...
MySQL连接的原理
连接的原理连接简介连接的本质为了故事的顺利发展,我们先建立两个简单的表并给它们填充一点数据:
mysql> CREATE TABLE t1 (m1 int, n1 char(1));Query OK, 0 rows affected (0.02 sec)mysql> CREATE TABLE t2 (m2 int, n2 char(1));Query OK, 0 rows affected (0.02 sec)mysql> INSERT INTO t1 VALUES(1, 'a'), (2, 'b'), (3, 'c');Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0mysql> INSERT INTO t2 VALUES(2, 'b'), (3, 'c'), (4, 'd');Query OK, 3 rows affected (0.00 sec ...
Java 设计模式 - 组合模式
组合模式介绍
这有点像螺丝 和螺母,通过⼀堆的链接组织出⼀棵结构树。而这种通过把相似对象 ( (也可以称作是方法)组合成⼀组可被调用的结构树对象的设计思路叫做组合模式。
这种设计⽅式可以让你的服务组节点进⾏⾃由组合对外提供服务,例如你有三个原⼦校验功能( A:身份 证 、 B:银⾏卡 、 C:⼿机号 )服务并对外提供调⽤使⽤。有些调⽤⽅需要使⽤AB组合,有些调⽤⽅需要 使⽤到CBA组合,还有⼀些可能只使⽤三者中的⼀个。那么这个时候你就可以使⽤组合模式进⾏构建服 务,对于不同类型的调⽤⽅配置不同的组织关系树,⽽这个树结构你可以配置到数据库中也可以不断的 通过图形界⾯来控制树结构。
所以不同的设计模式⽤在恰当好处的场景可以让代码逻辑⾮常清晰并易于扩展,同时也可以减少团队新 增⼈员对项⽬的学习成本
案例场景模拟
以上是⼀个非常简化版的营销规则 决策树 ,根据 性别 、 年龄 来发放不同类型的优惠券,来刺激消费起 到精准用户户促活的目的
⽤⼀坨坨代码实现这⾥我们举⼀个关于 ifelse 诞⽣的例⼦,介绍⼩姐姐与程序员 之间的 故事 导致的 事故 。
⼯程结构itstack-demo-des ...
MySQL单表访问方法
单表访问方法为了故事的顺利发展,我们先得有个表:
CREATE TABLE single_table ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(100), key2 INT, key3 VARCHAR(100), key_part1 VARCHAR(100), key_part2 VARCHAR(100), key_part3 VARCHAR(100), common_field VARCHAR(100), PRIMARY KEY (id), KEY idx_key1 (key1), UNIQUE KEY idx_key2 (key2), KEY idx_key3 (key3), KEY idx_key_part(key_part1, key_part2, key_part3)) Engine=InnoDB CHARSET=utf8;
我们为这个 single_table 表建立了1个聚簇索引和4个二级索引,分别是:
为 id 列建立的聚簇索引。
为 k ...
MySQL中InnoDB的表空间
InnoDB的表空间表空间 是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为 表名.ibd 的实际文件。大家可以把表空间想象成被切分为许许多多个 页 的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。
回忆一些旧知识页面类型InnoDB是以页为单位管理存储空间的,我们的聚簇索引(也就是完整的表数据)和其他的二级索引都是以 B+ 树的形式保存到表空间的,而 B+ 树的节点就是数据页。
这个数据页的类型名其实是: FIL_PAGE_INDEX ,除了这种存放索引数据的页面类型之外,InnoDB也为了不同的目的设计了若干种不同类型的页面:
类型名称
十六进制
描述
FIL_PAGE_IBUF_BITMAP
0x0005
Insert Buffer位图
FIL_PAGE_TYPE_SYS
0x0006
系统页
FIL_PAGE_TYPE_TRX_SYS
0x0007
事务系统数据
FIL_PAGE_TYPE_FSP_HDR
0x0008
表空间头部信息
FI ...
DDD(中)
DDD 建模方法四色建模(风暴事件)是整个 DDD 这套软件设计方法中用于工程拆分界限上下文的非常重要的实践手段。通过建模过程快速识别业务领域中的关键事件和核心流程,也是在这个过程中设计出领域对象的,为后面详细设计和代码开发做指导。
可以把整个过程理解为,为工程开发提供面向对象设计,涵盖;领域拆分、界限串联、功能聚合。所以相比Service + 数据模型的贫血开发方式,DDD 前期需要付出更多的设计成本,但对于软件的长周期迭代,这样的好处是非常大的。
1. 建模目的工程的建模的目的是为了我们做工程开发时提供指导方案,就像一栋大楼的设计蓝图一样,也像一个超市中会有不同品类的货架,需要提前规划好。所以你需要在工程开发时所需的各类核心内容,都会在建模中体现,如;分几个包、有哪些核心对象、要串联什么流程、有哪些核心业务要实现、过程中与外部服务的交互。
那么为了达成一个讨论的共识,而不是每个人都有一套的标准和词汇。所以会使用 DDD 提供专门的建模方法和名词进行统一的设计,此外因为 DDD 的统一建模语言,不涉及技术编码,也具有通用性,所以可以在建模过程让产品、研发、测试、架构师等人员一起参与讨 ...