201704-27 InnoDB体系结构及工作原理 NEW 概念InnoDB主要包括了内存池、后台线程以及存储文件。INNODB的三大特性:插入缓存,两次写,自适应hash内存池又是由多个内存块组成的,主要包括Buffer Pool、redo log缓冲等,解决cpu速度和磁盘速度的严重不匹配问题后台线程则包括了Master Thread、IO Thread以及Purge Thread等,后台进程保证缓存池和磁盘数据的一致性(读取、刷新),并保证数据异常宕机时能恢复到正常状态。由InnoDB存储引擎实现的表的存储结构文件一般包括表结构... Read More >
201704-26 mysql中一条sql语句是如何执行的 NEW 架构mysql是一种单进程多线程的架构,mysql server层的核心组件:连接器、查询缓存、分析器、优化器、执行器一条sql语句是如何执行的客户端发送一条查询给服务器服务器先检查查询缓存,如果命中缓存,则返回缓存结果服务器进行sql解析、预处理、再有优化器生成对应的执行计划mysql根据优化器生成的执行计划,调用存储引擎的API来执行查询返回结果连接器作用:建立连接、权限验证连接完成后,如果我们没有后续动作,则连接处于空闲状态 show processlist... Read More >
201704-25 mysql中AnalyzeTable优化 NEW Analyze TableMySQL的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应的列包含多少个不同的值——如果cardinality大大少于数据的实际散列程度,那么索引就基本失效了。我们可以使用SHOW INDEX语句来查看索引的散列程度语法ANALYZE TABLE 表名1 [,表名2…] ;SHOW INDE... Read More >
201704-24 mysql中QueryCache优化 原理 MySQL 的 Query Cache 实现原理实际上并不是特别的复杂,简单的来说就是将客户端请求的 Query 语句(当然仅限于 SELECT 类型的 Query)通过一定的 hash 算法进行一个计算而得到一个 hash 值,存放 在一个 hash 桶中。同时将该 Query 的结果集(Result Set)也存放在一个内存 Cache 中的。存放 Query hash 值的链表中的每一个 hash 值所在的节点中同时还存放了该 Query 所对应的 Re... Read More >
201704-23 mysql中distinct的实现与优化 概念DISTINCT 实际上和 GROUP BY的操作非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,在仅仅只是 DISTINCT 操... Read More >
201704-22 mysql中group by的实现与优化 概念 由于 GROUP BY 实际上也同样需要进行排序操作,而且与 ORDER BY 相比,GROUP BY 主要只是多了 排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函 数的计算。所以,在 GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。 在 MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息 来完成 GRO... Read More >
201704-21 mysql中order by的实现与优化 概念在 MySQL 中,ORDER BY 的实现有如下两种类型: ◆ 一种是通过有序索引而直接取得有序的数据,这样不用进行任何排序操作即可得到满足客户端 要求的有序数据返回给客户端; ◆ 另外一种则需要通过 MySQL 的排序算法将存储引擎中返回的数据进行排序然后再将排序后的数据返回给客户端;示例首先分析一下第一种不用排序的实现方式EXPLAIN SELECT m.id,m.subject,c.content FROM group_... Read More >
201704-20 mysql中Join的实现原理及优化思路 实现原理在MySQL中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据, 再一次通过循环查询条件到第三个表... Read More >
201704-19 mysql中Query语句优化基本思路和原则 基本思路和原则在分析如何优化 MySQL Query 之前,我们需要先了解一下 Query 语句优化的基本思路和原则。一般来说,Query 语句的优化思路和原则主要体现在以下几个方面: 1. 优化更需要优化的 Query; 2. 定位优化对象的性能瓶颈; 3. 明确的优化目标; 4. 从 Explain 入手; 5. 多使用 profile 6. 永远用小结果集驱动大的结果集; 7. 尽可能在索引中完成排序; 8. 只取出自己需要的 Columns; 9. 仅仅使用最有效的过... Read More >
201704-18 mysql中Query语句对系统性能的影响 背景我们重点分析实现同样功能的不同 SQL语句在性能方面会产生较大的差异的根本原因,并通过一个较为典型的示例来对我们的分析做出相应的验证。为什么返回完全相同结果集的不同SQL语句,在执行性能方面存在差异呢?这里我们先从SQL 语句在数据库中执行并获取所需数据这个过程来做一个大概的分析了。详解当 MySQL Server 的连接线程接收到 Client 端发送过来的 SQL 请求之后,会经过一系列的分解 Parse,进行相应的分析。然后,MySQL 会通过查询优化器模块(Opt... Read More >
201704-17 mysql中优化器是如何选择索引的 一:概念 - 在 索引建立之后,一条语句可能会命中多个索引,这时,索引的选择,就会交由 优化器 来选择合适的索引。 - 优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。 二:优化器选择索引的原则? - 在数据库里面,扫描行数是影响执行代价的因素之一。 - 扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少。 - 当然,扫描行数并不是唯一的判断标准,优化器还会结合是否使用临... Read More >
201704-16 mysql中explain分析sql详解 Explain举例mysql> explain select * from event; +—-+————-+——-+——+—————+——+———+——+——+——-+ | id | select_type | table | type | possible_keys | key&nbs... Read More >
201704-15 innodb中内存管理机制BufferPool 内存结构InnoDB主索引是聚簇索引,索引与数据共用表空间,对于InnoDB而言,数据就是索引,索引就是数据。InnoDB缓存机制和MyISAM缓存机制的最大区别就是在于,InnoDB不仅仅是缓存索引,还会缓存数据。InnoDB缓存池InnoDB缓存池(InnoDB buffer pool)是InnoDB性能提升的核心,它既可以缓存数据还可以缓存索引,甚至其他管理数据(例如元数据信息,行级锁信息)。查看InnoDB缓存池的相关参数信息show variables&n... Read More >
201704-14 innodb中统计数据是如何收集的 InnoDB 统计数据如何查看 1. 通过SHOW TABLE STATUS可以看到关于表的统计数据 2. 通过SHOW INDEX可以看到关于索引的统计数据InnoDB提供了两种存储统计数据的方式 1. 永久性的统计数据:这种统计数据存储在磁盘上,也就是服务器重启之后这些统计数据还在。 2.... Read More >
201704-13 mysql中性能分析Profiling 概念Show Profile是mysql提供可以用来分析当前会话中语句执行的资源消耗情况,可以用于Sql调优的测量。示例1、先查看是否开启了此功能,默认情况下,参数处于关闭状态,为OFF状态 show variables like 'profiling%';2、开启Profiling: set profiling=1;... Read More >
201704-12 mysql中eq_range_index_dive_limit参数学习 概念官方文档如下描述:This variable indicates the number of equality ranges in an equality comparison condition when the optimizer should switch from using index dives to index statistics in estimating the number of qualifying rows. It applies t... Read More >
201704-11 mysql中数据页的相关概念 概念在 InnoDB 存储引擎中,所有的数据都被逻辑地存放在表空间中,表空间(tablespace)是存储引擎中最高的存储逻辑单位,在表空间的下面又包括段(segment)、区(extent)、页(page),他们之间的关系如下:数据页页是mysql中磁盘和内存交换的基本单位,也是mysql管理存储空间的基本单位。同一个数据库实例的所有表空间都有相同的页大小;默认情况下,表空间中的页大小都为 16KB,当然也可以通过改变 innodb_page_size 选项对默认大小进行修... Read More >
201704-10 mysql中index_merge索引合并优化 前言深入理解 index merge 是使用索引进行优化的重要基础之一。理解了 index merge 技术,我们才知道应该如何在表上建立索引。MySQL在分析执行计划时发现走单个索引的过滤效果都不是很好,对多个索引分别进行条件扫描,然后将它们各自的结果进行合并(intersect/union)。我们的 where 中可能有多个条件(或者join)涉及到多个字段,它们之间进行 AND 或者 OR,那么此时就有可能会使用到 index merge 技术。MySQL5.0之前,一... Read More >
201704-09 redis中单线程为什么这么快 一. Redis性能如此高的原因1. 纯内存操作,内存的读写速度非常快2. 单线程,保证了每个操作的原子性,省去了很多上下文切换线程的时间3. 高效的数据结构,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。4. 合理的数据编码5.Redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在i... Read More >
201704-09 mysql中优化必读 通用规则多读少写加缓存,少读多写加队列带事务的不要整体commit,分段commit一、要保证数据库的效率,要做好以下四个方面的工作:① 数据库设计② sql语句优化③ 数据库参数配置④ 恰当的硬件资源和操作系统二、通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;(只要是关系型数据库都满足1NF... Read More >