从开始撰写这本关于 MySQL 数据库系统性能调优及架构设计的图书到现在已经5个月时间了,从最初到现在,即使连初稿都没有完成,就已经修改过多次。包括提纲内容,章节调整删减等等。
期间收到过很多朋友的建议与意见,都对我有很大的帮助,在此表示真诚的感谢!
明天就要回家休假了,到时候可能会有一段时间不会上网,不过大家放心,仍然会坚持写作。在回家之前将目前的进度大体说一下:
第一篇基础篇基本完成,但有一幅非常重要的图暂时还没有画;
第二篇维护篇完成70%,暂停写作;
第三篇优化篇完成95%,待整合修整;
第四篇架构篇完成50%,正在进行中;
注:以上所有内容目前还处于比较粗糙的初稿阶段
考虑到受众对象对内容的期望以及网友相关建议,经过和出版社商量,有可能会对第一篇和第二篇做一些调整,合为一篇,但目前还并没有确定,如果各位朋友有任何建议和意见,随时可以 Mail 反馈给我 sky000 [AT] gmail.com。
再次感谢各位朋友给我提出的很多宝贵建议以及对我的支持,谢谢!

, , ,

为本人所在 Team(Alibaba DBA Team)发个招聘的小广告,详细信息如下:
MySQL DBA
职位描述:

管理MySQL数据库
开发项目支持与优化
MySQL数据库性能优化
MySQL数据库高级特性测试,优化与实践

岗位要求:

精通SQL
熟悉SQL Tuning
熟悉MySQL数据库架构与管理
熟悉MySQL Replication与NDB cluster的原理
熟悉LINUX操作系统
熟悉shell,perl(掌握一门)
良好的沟通技能、团队合作能力
熟悉unix环境下C语言编程者优先

注:不要太聪明的,只要做事踏实的
Oracle 开发 DBA
职位描述:

评估,跟踪,支持开发项目
数据库变更管理
Schema设计与审核
数据库开发性能优化
开发、测试环境管理与维护

岗位要求:

精通SQL,PL/SQL
精通SQL Tuning
精通数据库建模
熟悉Oracle基本管理
有开发经验者优先
良好的沟通技能、团队合作能力

注:此招聘广告长期有效
有意者请将简历 Mail 至本人邮箱: sky000 [AT] gmail.com

, , ,

接上一篇: MySQL 中 GROUP BY 基本实现原理
DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已。所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别。同样可以通过松散索引扫描或者是紧凑索引扫描来实现,当然,在无法仅仅使用索引即能完成 DISTINCT 的时候,MySQL 只能通过临时表来完成。但是,和 GROUP BY 有一点差别的是,DISTINCT 并不需要进行排序。也就是说,在仅仅只是 DISTINCT 操作的 Query 如果无法仅仅利用索引完成操作的时候,MySQL 会利用临时表来做一次数据的“缓存”,但是不会对临时表中的数据进行 filesort 操作。当然,如果我们在进行 DISTINCT 的时候还使用了 GROUP BY 并进行了分组,并使用了类似于 MAX 之类的聚合函数操作,就无法避免 filesort 了。
下面我们就通过几个简单的 Query 示例来展示一下 DISTINCT 的实现。
1.首先看看通过松散索引扫描完成 DISTINCT 的操作:
sky@localhost : example 11:03:41> EXPLAIN SELECT DISTINCT group_id     -> [...]

, , ,

之前连着写了几篇关于 MySQL 中常用操作的一些基本实现原理,如,MySQL ORDER BY,MySQL Join,这次再写一篇 MySQL 中 GROUP BY 的基本实现原理。
由于 GROUP BY 实际上也同样会进行排序操作,而且与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算。所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。
在 MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析。
1.使用松散(Loose)索引扫描实现 GROUP BY
何谓松散索引扫描实现 GROUP BY 呢?实际上就是当 MySQL 完全利用索引扫描来实现 GROUP BY 的时候,并不需要扫描所有满足条件的索引键即可完成操作得出结果。
下面我们通过一个示例来描述松散索引扫描实现 GROUP BY,在示例之前我们需要首先调整一下 group_message 表的索引,将 gmt_create 字段添加到 group_id 和 user_id 字段的索引中:
sky@localhost : example 08:49:45> create index [...]

, ,

在 MySQL 中,只有一种 Join 算法,就是大名鼎鼎的 Nested Loop Join,他没有其他很多数据库所提供的 Hash Join,也没有 Sort Merge Join。顾名思义,Nested Loop Join 实际上就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果还有第三个参与 Join,则再通过前两个表的 Join 结果集作为循环基础数据,再一次通过循环查询条件到第三个表中查询数据,如此往复。
还是通过示例和图解来说明吧,后面将通过我个人数据库测试环境中的一个 example(自行设计,非MySQL 自己提供) 数据库中的三个表的 Join 查询来进行示例。
注意:由于这里有些内容需要在MySQL 5.1.18之后的版本中才会体现出来,所以本测试的MySQL 版本为5.1.26
表结构:
sky@localhost : example 11:09:32> show create table user_groupG*************************** 1. row ***************************Table: user_groupCreate Table: CREATE TABLE `user_group` (`user_id` int(11) NOT NULL,`group_id` int(11) NOT NULL,`user_type` int(11) NOT NULL,`gmt_create` datetime NOT NULL,`gmt_modified` datetime [...]

, , ,