《SQL基础教程(第2版)》做者MICK:上帝存在于细节之中(图灵访谈)

本文仅用于学习和交流目的,不得用于商业目的。非商业转载请注明做译者、出处,并保留本文的原始连接:http://www.ituring.com.cn/art...html

enter image description here

访谈嘉宾:MICK, 就任于日本的一家系统开发公司,是性能方面的工程师。专业领域是BI/DWH之类的大规模数据解析系统的设计和性能优化,若是发生性能问题,也会去应对OS资源或者Java的内存解析等各个方面。此外,最近也担任培训工做,培养公司内部的年轻工程师。前端

从学生时期开始,MICK就一直是合唱团(choir)的一员,不过最近的兴趣主要是作孩子的玩伴。数据库


enter image description here

【推荐语】编程

本书针对那些初次接触SQL和关系型数据库的读者,帮助他们从SQL的基础知识开始学习,包含从最初的SELECT/UPDATE/DELETE这些SQL的基本语法,到CASE表达式、表结合、关联子查询、窗口函数等重要功能的知识点。此外,因为本书以标准SQL的语法做为基础进行学习,因此不论数据库产品有什么差异,均可以做为一项便携有用的技术常伴身边。——MICK安全

enter image description here


访谈实录:

日文版

我的话题

技术人士给人的印象通常会比较“宅”,生活中您是怎样的一我的呢?

去年秋天,个人小孩儿出生了,因此如今的我的时间基本上都是陪孩子的。一块儿去动物园啊(新闻报道了熊猫宝宝出生的消息),一块儿玩玩具什么的。虽然可以亲眼看着孩子成长是件很是快乐和使人感动的事,但孩子身上总也用不完的能量和精力,对于陪伴他们成长的父母来讲倒是很头疼的事情(笑)。如今,基本上没有什么时间学习技术,也是挺苦恼的。性能优化

日本技术圈会经过哪些形式相互交流、学习呢?

日本这边的学习会和研讨会特别的频繁和活跃。虽然时间基本上多数是在平日下班以后举办,但仍然有不少人在繁忙的工做中挤出时间来参加。这样的学习会有时会分行业举办,有时也会以特定的技术领域(DB、Java、Ruby、机器学习等)为主题举办。我本身也会参加DB的学习会,还曾经被委托作过演讲。由于这不只仅对本身,并且对整个IT行业的发展很是重要,因此在接到委托的时候,我基本全都会接受。服务器

日本是个讲究效率的社会,生活节奏相对较快。您作到兼顾工做、生活、写做的秘诀有哪些?

秘诀啊......好难啊(笑)。坦白说,20多岁的时候,是凭体力。那时候公司的工做很忙,晚上很晚才能回家,回家后经常也会继续学习或者写书。可是这样确定不能持续太长时间,那只是年轻时的特权而已。说到窍门,就是活用间隙的时间。我是坐电车上下班的(到公司大概45分钟),从智能手机普及以来,我就会在电车中把忽然浮现出的文章记录下来,或者翻译英语的技术报道,回一回邮件,整理琐碎的任务,等等。这样就能够有大量的时间用于学习和写书等真正重要的活动了。微信

写书话题

什么契机让您开始编写技术书的?

最初,我是在本身的我的网站上刊登技术相关的信息。网络

原本并无写书的打算,只是想把备忘录跟你们分享而已。后来,看过网站的出版社编辑给我发来了为网络杂志编写技术报道的邀请,我接受了那个邀请,慢慢开始成为了一个撰稿人,继而开始写书。框架

《SQL基础教程》出版以来,广受读者好评,您认为这本书受到读者喜好的缘由有哪些呢?

能在日本和中国两个不一样语言的国家都受到好评,我真的很是高兴。我在写这本书的时候比较注重的是“写一本当本身仍是初学者时想要读的书”。不只是SQL还有那些编程语言的入门书,基本上都不会对详细的原理进行讲解,“暂且记住这么写”这样的内容也不少。这些就是所谓的“料理书”或者“食谱”书。对我来讲,即使是入门书,我也不会采用这样的写法。由于若是最开始不理解其中的原理,终究没法脱离初学者的阶段。

要写出如此浅显易懂、细致入微的入门书,须要对事物有细致的观察和深入的理解,请问您是如何作到的呢?

确实,我很是注意不能疏于“对事物细致入微的观察”这一点。换句话说,就是“不能无视细小的不协调”。 开始学习某个领域的时候,我经常会带着“为何会这样呢”这种疑问,而且从不无视这样的疑问,认真调查直到真正解决问题为止。

例如,最开始学习SQL的时候,若是要检索NULL,咱们不能用“<列名> = NULL”,必须写成“<列名> IS NULL”,这样的语法规则很是难以想象。为何不能使用“=”呢?这样的疑问,若是不深究,只是按照“就是这样写的”背下来,也是能够的。可是,这样作就没法掌握实际的应用能力,很快就会遇到成长的瓶颈期。我认为,可以达到理解本质的最好方法,就是不要无视见到的琐碎疑问。“上帝存在于细节之中(God is in the details)”是个人座右铭之一。

将来有第三版的写做计划吗?若是有,会在哪些方面对第二版进行补充或更新?

虽然如今尚未第3版的写做计划,不过若是做为补充的话,我会考虑如下两种方式。一种是加入SQL的应用技术。如今,SQL做为大数据加工分析的工具,出现了不少比之前更高级的用法。经过活用窗口函数和CASE表达式,能够建立出很是方便的程序。目前已经出版了的两个版本都是停留在基本使用方法的讲解上,因此正在考虑扩充一些顺应时代的内容。另外一种是加入关于SQL/RDB在系统开发总体中位置的说明。例如,追加一些相似SQL注入原理和对策,针对实际系统开发中如何应用SQL/RDB的内容。

技术书翻译

咱们知道,您曾经翻译过Joe Celko的书,关于Joe Celko和他的著做,能够说一下您的见解吗?

Celko的 Joe Celko's SQL for Smarties 是我学习SQL时的教科书。能够说,关于SQL的几乎全部知识都是从他那里学到的。这是一本很是庞大而且难懂的书,因此读起来很是辛苦。实际上,我写书的动机之一,就是“想把Celko的书讲解得更加容易理解”。提及来,个人书其实就是对Celko书的注解。

做为译者,您是怎么决定是否翻译某本书的呢?

如今,我正在翻译Celko的另外三本书。从20岁出头开始读他的书以来,就一直很是地尊敬他,因此一直想何时能有机会翻译他的书。我本身甚至有向出版社提案的那种热情。除了Celko之外,也有不少很是好的数据库方面的英文书,也但愿何时能翻译这样的书。

翻译技术书,对译者的现有知识有哪些影响?翻译过程当中,译者会加入一些本身的理解或建议吗?

如上所述,Celko的书很是难懂,仅读一次不管如何也没法理解。因此,翻译的时候,会加入不少可以让读者容易理解的注释。另外,不赞同做者意见的时候,也会努力作到代表本身的观点,为读者提供能够本身思考的机会。

在中国,存在着大量针对以《论语》为首的深奥古籍的注解书。像朱熹的《论语集注》和何晏的《论语集解》,在日本也有普遍的读者。这样的注释文本不只仅是说明语言的意思,而且加入了不少独立思考的内容,很是有创造性。我也但愿像这样,不作单纯的语言变换,而是觉得原书带来更多的附加价值为目标进行翻译。

关系型数据库和非关系型数据库

能够简单介绍一下关系型数据库和非关系型数据库(NoSQL)的特色及适合的应用场景吗?

NoSQL刚出现的时候,就有一些关于它会不会取代关系型数据库这样的说法。可是通过了这么多年,如今已经稳定在了“适才适所”的形式上。NoSQL的种类很是多,因此没法一语概之,比较有表明性的是按照种类来区分。

(1)Key Value Store (KVS) Memcached、Redis、DynamoDB(※)等

(2)文本型DB MongoDB、DynamoDB等

※也具备文本型DB的功能。

我以为(1)的优势有两个。一个是经过将数据构造进行Key-Value这种一对一的单纯化处理,使高速查询变成可能。放弃SQL查询的自由度,取而代之的则是对速度的追求。使数据增长时的可扩展性更加丰富。经过KVS,特别是将数据内存化以后,可使性能得到提升。

(2)的优势是,经过JSON和XML等形式,能够将过去关系型数据库中以“表”的形式存在、比较难处理的数据,变得很是自由。这样,就能够用来处理那些没有进行正规化严密设计的各式各样的数据了。

不过,无论是哪一种类型,都会牺牲掉关系型数据库那种高度的事务处理功能和数据安全性。从“结果一致性”字面意思就能知道,它只能保证数据变动后最终保持在正确的状态,容许有暂时的不一致。所以,(1)能够应用于“须要高速应答,容许某种程度的数据不一致和消失”的数据处理。具体来讲,就是像SNS投稿那样的流数据或者EC网站中用户的Session信息,等等。对于Session信息来讲,即便是最糟糕的丢失情况,也能够经过再次登陆来重置。但是那些已购商品记录和付款数据的消失是绝对不能容许的。所以,相似这样的状况就须要使用KVS做为前台,关系型数据库做为后台这种常规的设计。

此外,还有一些用来处理非结构数据的数据库(虽然对其是否能够称为NoSQL仍存在乎见分歧)。总之,就是相似于图像和声音等非文字数据,以及像图形结构这种过去的关系型数据库处理起来比较棘手的数据。这样的数据库,是专门用来处理那些关系型数据库没法处理(或者难以处理)的数据的,在特定用途领域,也有取代关系型数据库而存在的可能性。

可是,尽管如此,由于关系型数据库的稳定性和泛用性很是杰出,因此使用关系型数据库构建核心系统,在更加轻便的前端等细分领域使用NoSQL,这样的形式从此会一直持续下去。

非关系型数据库(NoSQL)未来会成为数据管理的将来趋势嘛?

我认为NoSQL有两个发展方向。一是NoSQL从此还有独自发展的可能性。另外就是它做为关系型数据库的一个功能被吸取的可能性。实际上,过去的XML数据库,最初是做为独立的数据库产品出现的,可现现在已经做为大多数DBMS的一个功能被吸取了。即便如今,关系型数据库也存在扩充处理JSON和地图信息(Spatial DB)的功能,最终成为一个包含NoSQL功能的“你们族”的可能性。无论怎样,我想做为工程师,学习如何处理非结构数据的技术从此都会愈来愈重要。

后辈寄语

您认为,新手在学习SQL时有哪些平时须要培养的习惯?在效率和规范性等方面,可否给出一些建议?

我想应该是,最开始不要去熟记那些小聪明式的技巧和“秘诀”,而是可以用心去理解动做原理吧。SQL跟Java等其余编程语言相比,由于其函数和功能的数量比较少,又接近英语这种天然语言,因此乍一看很简单。但实际上,那些“简单的功能”(关联、CASE表达式、窗口函数、HAVING语句,等等)组合到一块儿,就会变得极为复杂。这一点上SQL可能跟积木很像。若是忽略了对每一个基础积木块的理解,那就绝对不可能作出很高的建筑物

若是之后想从事软件开发工做,初学者在学习完《SQL基础教程》之后,还须要在哪些方面努力?您可否给些专业的建议?

本书终归是聚焦于帮助你们理解SQL语法这一目的。实际上,对于技术人员所必需的知识而言,这些SQL的知识是远远不够的,因此但愿你们可以将目光投向更广阔的领域。例如,即便只是在数据库领域,也存在相似ER建模,Oracle、MySQL等产品的设计技术,SQL性能优化等,都是须要花不少年来学习的技术领域。若是各位读者是软件开发人员的话,我想也必须学习Java、PHP、Python等开发语言吧。

你们的目标是什么,这是由你们本身的职业意向和市场需求决定的,因此我不能一律而论地给出建议。但无论是哪一个领域,带着兴趣学习是很是重要的。所以,尽早找到本身可以保持学习动力的领域,可以持续保持兴趣地进行工做,是很是重要的。

在软件概要设计的初期,不一样的项目须要选择不一样的数据库。您可否简单介绍一下该怎样选择合适的数据库?

如今,在日本能够选择的关系型数据库有Oracle、SQL Server、DB二、PostgreSQL、MySQL这5个表明。如何选择,对技术工程师来讲是很是重要的问题,是必须综合考虑多种因素的难题。

但现实中,有时候咱们并无选择权。一句话,就是经常会受到“钱”的制约。譬如在公司启动,须要创建新服务的时候,为了尽可能下降许可证的费用,除了PostgreSQL和MySQL这些基于OSS的数据库之外别无选择。而若是是为金融机构和公共机构构建那种追求很是高的可用性和性能的系统时,则必须选择Oracle这种具备高功能而且能做为供应商提供细致周到的支持服务的产品。又或者是EC网站之类的信息流量随季节变更比较频繁的场合,选择Amazon RDS之类基于云上的,做为SaaS的数据库,多是性价比最高的。

近年来,任何一种数据库产品,在功能的充实性方面都难分伯仲,所以跟过去的选择基准相比,上面给的预算制约、非功能性、支持的充实度等方面就变得更加剧要了。

关于提升SQL的性能,能够跟咱们分享一下您的经验和建议吗?好比复杂SQL(多表嵌套查询,关联查询)或存储过程当中,通常在什么地方容易引起性能问题?

SQL性能优化是个人专业之一。虽然SQL很是容易引起性能问题,但其实坦率地说,主要仍是由于数据库处理的数据量太大引发的。Web服务器和AP服务器最多只能处理可以保存在内存中的那个水平的数据量(GB级别)。可是,在数据库服务器上处理TB级别的数据倒是理所固然的。近年来,随着大数据的流行,数据量也逐渐增大。

这必然会使从存储器中读取数据时的速度成为难以超越的瓶颈,也就形成了不少SQL的性能问题。特别是在进行大表关联的时候,这样的问题更加显著。

若是要在本次采访中讲述解决办法的话,篇幅可能不太够。我计划写一本专门针对SQL性能改善的书。可是,若是要举一个立刻能够实践的改善方法的例子的话,那就是在DB服务器上尽可能多的搭载物理内存,给数据库分配更多的内存好让数据库可使用更多的内存。之前,内存的价格比较高,但最近正趋于低价格化,32GB或者64GB的内存,均可以毫无压力地搭载在通常的DB服务器上。内存与通常的HDD相比速度要快不少,若是能在内存上保存数据的话,就能够解决不少性能方面的问题。虽然这只是用金钱来代替头脑的解决方案,不过由于这种投资效果显著,因此仍是比较推荐的。(笑)

若是要举一个设计上须要注意的例子,那就是尽可能减小SQL处理的数据量,把它做为基本方针。那些几乎不须要的旧数据能够转移到历史数据表中。对于能在画面上设定的数据查询条件,尽可能让用户来设定,等等。

SQL性能优化是针对经过设计上的努力也没法解决的问题的最后手段。不要从一开始就依赖SQL性能优化,不须要SQL性能优化的设计才是很是重要的,这一点请你们牢记


特约记者:

孙淼,从事对日软件设计和研发工做十余年,曾于2007年至2009年赴日学习工做,2015年至今再次长期赴日工做。精通应用Java、PHP进行Web框架的设计开发,而且有Oracle、Teradata、MySQL、NoSQL等多种数据库的设计开发经验。乐于品味生活细微的点滴,热衷于品尝和制做美食。是《SQL基础教程》的译者。


更多精彩,加入图灵访谈微信!

相关文章
相关标签/搜索