MySQL45讲
文章平均质量分 89
巧啡豆
我好菜呀~~~
展开
-
第十八讲笔记——为什么 SQL语句逻辑一样,但是性能差异巨大
MySQL 规定:如果对字段做了函数计算,就用不上索引。案例一:条件字段函数操作在一个表中有一个时间字段(t_modified),也在时间字段上创建了索引,现在使用如下的 SQL 语句:select count(*) from tradelog where month(t_modified)=7;很遗憾,这条语句使用不了时间字段上的索引,因为对字段使用了函数计算。下面是索引示意图,方框上的数据就是 month() 函数对应的值。可见,时间的顺序排列的,但是计算之后的值确实被打乱了。实际上,原创 2021-11-29 17:57:21 · 508 阅读 · 0 评论 -
第十七讲笔记——如何显示随机消息
从单词表中随机选出三个单词。CREATE TABLE `words` (`id` int(11) NOTNULLAUTO_INCREMENT,`word` varchar(64) DEFAULTNULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;随机插入 10000 行数据,之后来分析。内存临时表select word fromo words order by rand() limit 3这个 SQL 就是随机排序取前三个,但执行过程有点复杂。我们使用 ex原创 2021-11-29 17:56:20 · 643 阅读 · 0 评论 -
第十六讲笔记——“order by”是怎么工作的?
假设需要查询城市是“杭州”的所有人名字,而且按照姓名排序返回前 1000 人的姓名、年龄。这个表的定义是这样的:CREATE TABLE `t` (`id` int(11) NOTNULL,`city` varchar(16) NOTNULL,`name` varchar(16) NOTNULL,`age` int(11) NOTNULL,`addr` varchar(128) DEFAULTNULL,PRIMARY KEY (`id`),KEY `city` (`city`)) ENG原创 2021-11-29 11:56:20 · 745 阅读 · 0 评论 -
第十五讲——日志答疑
在两阶段提交的不同瞬间,MySQL 如果发生异常是怎么保证数据完整性的?这是个 update 语句的执行流程吗,怎么会调用 commit语句?这里其实有**两个“commit”**的概念:平常说的“commit语句”,是指 MySQL 语法中,用于提交一个事务的命令。一般跟 begin/start transaction 配对使用。而这个图中是“commit步骤”,指的是事务提交过程中的一个小步骤,也是最后一步。当这个步骤执行完了,这个事物就提交了。“commit语句”执行时也包含“commi原创 2021-11-28 21:36:47 · 399 阅读 · 0 评论 -
第十四讲笔记——count(x) 这么慢,怎么办?
count(*) 的实现方式在不同引擎中,count(*) 有不同的实现方式MyISAM 引擎就把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回;InnoDB 就麻烦了,它执行 count(*) 时,全表扫描,累计行数。这里是没说过滤条件,加了 where 后,MyISAM 也是不能返回这么快的。为什么 InnoDB 不把全表总行数存起来呢?因为即使在同一时刻,由于多版本并发控制(MVCC)的原因,InnoDB 返回多少行也是不确定的。由于 InnoDB 默认的隔原创 2021-11-28 16:53:34 · 351 阅读 · 0 评论 -
第十三讲笔记——为什么删除了一般数据,空间还是这么大
InnoDB 表包含两部分,即:表结构定义和数据。在 MySQL 8.0 版本以前,表结构是存在以 .fm 为后缀的文件里。而 MySQL 8.0 版本,已经允许把表结构定义放在系统数据表中了。因为表结构占用空间很小,所以我们主要来讨论表数据。参数 inoodb_file_pre_table这个参数可以控制表数据是存在共享表空间里,还是单独文件。这个参数设为 OFF 表示,表的数据放在系统共享表空间,也就是跟数据字典放在一起;这个参数设为 ON 表示,每个 InnoDB 表数据存储在一个以 .i原创 2021-11-28 16:10:06 · 195 阅读 · 0 评论 -
十二讲笔记——为什么我的 MySQL 会“抖”一下
为什么 SQL 语句变“慢”了在 InnoDB 处理更新语句的时候,只做了写日志这个磁盘操作,这个日志叫 redo log(重做日志)。当 InnoDB 有空的时候,就把日志更新一下,这个就是把内存里的数据写入磁盘,这个操作叫做 flush。在做 flush 这个操作之前,内存中数据页的数据跟磁盘中的数据页数据是不一样的,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和数据库中的数据一致,我们称为“干净页”。注:不论是脏页还是干净页,都是在内存中的。可以想象,有时候数据库“抖”一下,可能原创 2021-11-28 15:23:20 · 200 阅读 · 0 评论 -
第十一讲笔记——怎么给字符串字段加索引
以一个邮箱登陆为例,用户表是这么定义的:mysql> create table SUser(ID bigint unsigned primary key,email varchar(64),...)engine=innodb;那么一定会出现这样的语句:select f1, f2 from SUser where email='xxx'前缀索引MySQL 支持前缀索引,也就是,你可以定义字符串的一部分作为索引。如果你在创建时不指定长度,则默认包含整个字符串。比如:alter ta原创 2021-11-25 16:21:29 · 223 阅读 · 0 评论 -
第十讲笔记:MySQL 为什么有时会选错索引
一般情况下我们写 SQL 语句不会去选择索引。我们先建个简单表,并往里面添加 100000 行数据,例如:(1,1,1)。。。(100000,100000,100000)CREATE TABLE `t` (`id` int(11) NOT NULL,`a` int(11) DEFAULT NULL,`b` int(11) DEFAULT NULL,PRIMARY KEY (`id`),KEY `a` (`a`),KEY `b` (`b`)) ENGINE=InnoDB;当想查看一条 S原创 2021-11-25 12:10:40 · 331 阅读 · 0 评论 -
第九讲笔记——普通索引和唯一索引,怎么选?
在索引的建立上,建议不要把内容较长的字段(例如:身份证)作为主键,太占用空间。上面有两个索引,我们分析下在查询和更新语句中性能如何?查询过程假设查询的语句是 select id from T where k=5。在普通索引上,查到满足条件的第一个记录(5,500)之后,再查找下一条记录,查到碰到不满足条件 k=5 的记录为止。在唯一索引上,由于索引有唯一性,所以找到第一个满足条件的记录之后,就停止检索。性能差距:微乎其微。因为,InnoDB 是按照页来读写的,默认页大小是 16KB。所以原创 2021-11-25 10:38:35 · 317 阅读 · 0 评论 -
第八讲笔记——事务到底是隔离的还是不隔离的?
让我们直接来看个例子吧。以下是一个只有两行表的初始化语句。mysql> CREATE TABLE `t` (`id` int(11) NOT NULL,`k` int(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t(id, k) values(1,1),(2,2);以下是三个事务的执行流程:这里的关键就是事务的启动时期。执行 begin/start transaction 命令并不是一个事务的起点,原创 2021-11-24 17:47:52 · 571 阅读 · 0 评论 -
第六、七讲笔记——MySQL中的锁
设计锁的初衷是为了处理并发问题。根据加锁的范围,MySQL 中的锁大致分为全局锁、表级锁、行锁三大类。全局锁全局锁是对整个数据库进行加锁。MySQL 使用 Flush tables whith read loc (FTWRL),就可以启动全局锁。这时整个数据库就处于只读状态。以下的语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务语句的提交语句。全局锁的使用场景是,做全库的逻辑备份。也就是把整个库的每个表 select 出来存成文本。但是如果让整个库处原创 2021-11-24 17:45:04 · 164 阅读 · 0 评论 -
第四、五讲笔记——MySQL中的索引
索引的目的就是为了提高数据的查询效率,就像字典的目录一样。索引的常见模型常见的有哈希表、有序数组、搜索树。哈希表哈希表是一种键值对的形式存储的数据结构。当遇到哈希冲突的时候,会在当前位置,拉出一个链表。由于接在位置上的链表不是有序的,所以哈希索引做区间查询的速度很慢。例如:找到 [ID_card_X, ID_card_Y] 这个区间的所有用户,就必须全部扫一遍。哈希表这种结构适用于只有等值查询的场景。有序数组有序数组在等值查询和范围查询场景中的性能都非常优秀。用上面那个找用户 ID 的例子原创 2021-11-23 16:43:05 · 544 阅读 · 0 评论 -
第三讲笔记——事务隔离
事务:保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的,所以本次分析事务是以 InnoDB 为例。隔离性与隔离级别事务有四大特性:ACID(Atomicity、consistency、Isolation、Durability),分别是原子性、一致性、隔离性、持久性。当多个事务同时执行的时候就有以下问题:脏写(dirty write):事务 B 去修改了事务 A 修改过的值,但是此时事务 A 还没提交,所以事务 A 随时会回滚,导致事务 B 修改的值也没了。原创 2021-11-22 19:52:57 · 534 阅读 · 0 评论 -
第二讲“SQL更新语句(redolog和binlog)”——笔记
更新语句和查询语句差不多。SQL更新例句:updata T set c = c + 1 where ID = 2;执行语句前连接数据库(连接器)。执行更新语句时,对于目标表的查询缓存会失效。分析器通过词法和语法分析知道是更新语句。优化器决定使用ID这个索引。执行器负责具体执行,调用存储引擎的接口,找到这一行并更新。redolog(重做日志)与binlog(归档日志)redolog(重做日志)binlog(归档日志)位置InnoDB 引擎特有的MySQL 本身原创 2021-11-22 19:50:56 · 527 阅读 · 0 评论 -
《MySQL45讲》笔记——第一讲
01、SQL 查询语句的执行MySQL 结构图#mermaid-svg-zuGWeCMKkT3ARkbr .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-zuGWeCMKkT3ARkbr .label text{fill:#333}#mermaid-svg-zuGWeCMKkT3ARkbr .node re原创 2021-11-21 22:40:39 · 265 阅读 · 0 评论