随笔分类 -  数据库理论

摘要:MySQL执行一个查询的过程,可以用下图表示: 我们可以看到当向MySQL发送一个请求的时候,MySQL究竟做了什么: 1、客户端发送一条查询给服务器。 2、服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一个阶段。 3、服务器端进行SQL解析、预处理,再由优化器生成对 阅读全文
posted @ 2018-12-17 17:28 小林子奋斗的点滴 阅读(140) 评论(0) 推荐(0)
摘要:设计查询的时候一个需要考虑的重要问题是,是否需要将一个复杂的查询分成许多简单的查询。MySQL内部每秒能够扫描内存中上百万行数据,相比之下,MySQL响应数据给客户端就慢的多了。所以,有时候将一个大的查询分解为多个小查询是有必要的。 4.3.1 切分查询 一个大查询如果一次性执行的话,可能一次锁住很 阅读全文
posted @ 2018-12-17 11:29 小林子奋斗的点滴 阅读(311) 评论(0) 推荐(0)
摘要:1. 减少请求的数据量 只返回必要的列:最好不要使用 SELECT * 语句。 只返回必要的行:使用 LIMIT 语句来限制返回的数据。 缓存重复查询的数据:使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。 2. 减少服务器端扫描的行数 阅读全文
posted @ 2018-12-17 10:45 小林子奋斗的点滴 阅读(118) 评论(0) 推荐(0)
摘要:为什么查询速度会慢? 在尝试编写快速的查询之前,真正重要的是响应时间。如果把查询看做一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上是要优化其子任务,要么消除其中的一些子任务,要么减少子任务的执行次数。 下面来看看如何进行性能优化: 使用 Explain 进行 阅读全文
posted @ 2018-12-17 10:14 小林子奋斗的点滴 阅读(117) 评论(0) 推荐(0)
摘要:1. 独立的列 在进行查询时,索引列不能是表达式的一部分,也不能是函数的参数,否则无法使用索引。 例如下面的查询不能使用 actor_id 列的索引: 2. 多列索引 在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更好。例如下面的语句中,最好把 actor_id 和 film 阅读全文
posted @ 2018-12-17 09:52 小林子奋斗的点滴 阅读(171) 评论(0) 推荐(0)
摘要:大大减少了服务器需要扫描的数据行数。 帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,因为不需要排序和分组,也就不需要创建临时表)。 将随机 I/O 变为顺序 I/O(B+Tre 阅读全文
posted @ 2018-12-17 09:50 小林子奋斗的点滴 阅读(190) 评论(0) 推荐(0)
摘要:索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构。 3.1.1 索引基础 B+ Tree 原理 1. 数据结构 B Tree 指的是 Balance Tree,也就是平衡树。平衡树是一颗查找树,并且所有叶子节点位于同一层。 B+ Tree 是基于 B Tree 和 阅读全文
posted @ 2018-12-16 23:38 小林子奋斗的点滴 阅读(169) 评论(0) 推荐(0)
摘要:2.2.1 第一范式 原子性:要求属性具有原子性,不可再分解。 如学生(学号,姓名,性别,出生年月日),如果认为最后一列还可以再分成(出生年,出生月,出生日),它就不是一范式了,否则就是。 2.2.2 第二范式 惟一性:要求记录有惟一标识,即实体的惟一性,即不存在部分依赖 表:学号、课程号、姓名、学 阅读全文
posted @ 2018-12-16 20:09 小林子奋斗的点滴 阅读(367) 评论(0) 推荐(0)
摘要:1.7.1 函数依赖 记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。 如果 {A1,A2,... ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。 对于 A->B,如果能找到 A 的真子集 A',使得 A'-> B, 阅读全文
posted @ 2018-12-15 22:21 小林子奋斗的点滴 阅读(173) 评论(0) 推荐(0)
摘要:选择数据类型的原则: (1)更小的通常更好; 一般情况下,应该尽量使用可以正确存储数据的最小数据类型。 (2)简单就好; 简单数据类型的操作通常需要更少的CPU周期。 (3)尽量避免NULL 如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较都更 阅读全文
posted @ 2018-12-15 22:12 小林子奋斗的点滴 阅读(199) 评论(0) 推荐(0)
摘要:间隙锁(next-key locking)是 MySQL 的 InnoDB 存储引擎的一种锁实现。 InnoDB采用MVCC来支持高并发,并且实现了四个标准的隔离级别。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻影读的出现。间隙 阅读全文
posted @ 2018-12-15 20:46 小林子奋斗的点滴 阅读(946) 评论(0) 推荐(0)
摘要:InnoDB: InnoDB是 MySQL 默认的事务型存储引擎,也是最重要、使用最广泛的存储引擎。只有在需要它不支持的特性时,才考虑使用其它存储引擎。被设计用来处理大量的短期事务,短期事务大部分情况是正常提交的,很少会被回滚。 InnoDB采用多版本并发控制(MVCC)来支持高并发,并且实现了四个 阅读全文
posted @ 2018-12-12 23:46 小林子奋斗的点滴 阅读(182) 评论(0) 推荐(0)
摘要:多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。而未提交读隔离级别总是读取最新的数据行,无需使用 MVCC。可串行化隔离级别需要对所有读取的行 阅读全文
posted @ 2018-12-11 09:29 小林子奋斗的点滴 阅读(185) 评论(0) 推荐(0)
摘要:1.3.1 事务 事物指的是满足 ACID 特性的一组操作,可以通过 Commit 提交一个事务,也可以使用 Rollback 进行回滚。事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 一般来说,事务是必须满足4个条件(ACID)::原子性(Atomici 阅读全文
posted @ 2018-12-10 22:17 小林子奋斗的点滴 阅读(502) 评论(0) 推荐(0)
摘要:无论何时,只要有多个查询需要在同一时刻修改数据,就会产生并发控制的问题。 MySQL提供锁来防止数据损坏,但是这种方案并不支持并发处理。 1.2.1 读写锁 共享锁(Shared),简写为 S 锁,又称读锁。是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,而互不干扰。 排它 阅读全文
posted @ 2018-12-10 00:18 小林子奋斗的点滴 阅读(190) 评论(0) 推荐(0)
摘要:mysql 数据库的逻辑架构如下图: 第一层所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。 第二层是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包 阅读全文
posted @ 2018-12-09 23:51 小林子奋斗的点滴 阅读(131) 评论(0) 推荐(0)