2025年1月7日 10:48 周二第一篇 阅读的层次
第一章 阅读的活力与艺术
#
这是一本为阅读的人,或是想要成为阅读的人而写的书。尤其是想要阅读书的人。说得更具体一点,这本书是为那些想把读书的主要目的当作是增进理解能力的人而写。
这里所谓“阅读的人”(readers),是指那些今天仍然习惯于从书写文字中汲取大量资讯,以增进对世界了解的人,就和过去历史上每一个深有教养、智慧的人别无二致。当然,并不是每个人都能做到这一点。即使在收音机、电视没有出现以前,许多资讯与知识也是从口传或观察而得。但是对智能很高又充满好奇心的人来说,这样是不够的。他们知道他们还得阅读,而他们也真的身体力行。
现代的人有一种感觉,读书这件事好像已经不再像以往那样必要了。收音机,特别是电视,取代了以往由书本所提供的部分功能,就像照片取代了图画或艺术设计的部分功能一样。我们不得不承认,电视有部分的功能确实很惊人,譬如对新闻事件的影像处理,就有极大的影响力。收音机最大的特点在于当我们手边正在做某件事(譬如开车)的时候,仍然能提供我们资讯,为我们节省不少的时间。但在这中间还是有一个严肃的议题:到底这些新时代的传播媒体是否真能增进我们对自己世界的了解?
或许我们对这个世界的了解比以前的人多了,在某种范围内,知识(knowledge)也成了理解(understanding)的先决条件。这些都是好事。但是,“知识”是否那么必然是“理解”的先决条件,可能和一般人的以为有相当差距。我们为了“理解”(understand)一件事,并不需要“知道”(know)和这件事相关的所有事情。太多的资讯就如同太少的资讯一样,都是一种对理解力的阻碍。换句话说,现代的媒体正以压倒性的泛滥资讯阻碍了我们的理解力。
会发生这个现象的一个原因是:我们所提到的这些媒体,经过太精心的设计,使得思想形同没有需要了(虽然只是表象如此)。如何将知识分子的态度与观点包装起来,是当今最有才智的人在做的最活跃的事业之一。电视观众、收音机听众、杂志读者所面对的是一种复杂的组成—从独创的华丽辞藻到经过审慎挑选的资料与统计—目的都在让人不需要面对困难或努力,很容易就整理出“自己”的思绪。但是这些精美包装的资讯效率实在太高了,让观众、听众或读者根本用不着自己做结论。相反的,他们直接将包装过后的观点装进自己的脑海中,就像录影机愿意接受录影带一样自然。他只要按一个“倒带”的钮,就能找到他所需要的适当言论。他根本不用思考就能表现得宜。
1.主动的阅读
#
我们在一开始就说过,我们是针对发展阅读书的技巧而写的。但是如果你真的跟随并锻炼这些阅读的技巧,你便可以将这些技巧应用在任何印刷品的阅读上—报纸、杂志、小册子、文章、短讯,甚至广告。
既然任何一种阅读都是一种活动,那就必须要有一些主动的活力。完全被动,就阅读不了—我们不可能在双眼停滞、头脑昏睡的状况下阅读。既然阅读有主动、被动之对比,那么我们的目标就是:第一提醒读者,阅读可以是一件多少主动的事。第二要指出的是,阅读越主动,效果越好。这个读者比另一个读者更主动一些,他在阅读世界里面的探索能力就更强一些,收获更多一些,因而也更高明一些。读者对他自己,以及自己面前的书籍,要求的越多,获得的就越多。
虽然严格说来,不可能有完全被动阅读这回事,但还是有许多人认为,比起充满主动的写跟说,读与听完全是被动的事。写作者及演说者起码必须要花一点力气,听众或读者却什么也不必做。听众或读者被当作是一种沟通接收器,“接受”对方很卖力地在“给予”、“发送”的讯息。这种假设的谬误,在认为这种“接收”类同于被打了一拳,或得到一项遗产,或法院的判决。其实完全相反,听众或读者的“接收”,应该像是棒球赛中的捕手才对。
捕手在接球时所发挥的主动是跟投手或打击手一样的。投手或打击手是负责“发送”的工作,他的行动概念就在让球动起来这件事上。捕手或外野手的责任是“接收”,他的行动就是要让球停下来。两者都是一种活动,只是方式有点不同。如果说有什么是被动的,就是那只球了。球是毫无感觉的,可以被投手投出去,也可以被捕手接住,完全看打球的人如何玩法。作者与读者之间的关系也很类似。写作与阅读的东西就像那只球一样,是被主动、有活力的双方所共有的,是由一方开始,另一方终结的。
我们可以把这个类比的概念往前推。捕手的艺术就在能接住任何球的技巧—快速球、曲线球、变化球、慢速球等等。同样地,阅读的艺术也在尽可能掌握住每一种讯息的技巧。
值得注意的是,只有当捕手与投手密切合作时,才会成功。作者与读者的关系也是如此。作者不会故意投对方接不到的球,尽管有时候看来如此。在任何案例中,成功的沟通都发生于作者想要传达给读者的讯息,刚好被读者掌握住了。作者的技巧与读者的技巧融合起来,便达到共同的终点。
事实上,作者就很像是一位投手。有些作者完全知道如何“控球”:他们完全知道自己要传达的是什么,也精准正确地传达出去了。因此很公平地,比起一个毫无“控球”能力的“暴投”作家,他们是比较容易被读者所“接住”的。
这个比喻有一点不恰当的是:球是一个单纯的个体,不是被完全接住,就是没接住。而一本作品,却是一个复杂的物件,可能被接受得多一点,可能少一点;从只接受到作者一点点概念到接受了整体意念,都有可能。读者想“接住”多少意念完全看他在阅读时多么主动,以及他投人不同心思来阅读的技巧如何。
主动的阅读包含哪些条件?在这本书中我们会反复谈到这个问题。此刻我们只能说:拿同样的书给不同的人阅读,一个人却读得比另一个人好这件事,首先在于这人的阅读更主动,其次,在于他在阅读中的每一种活动都参与了更多的技巧。这两件事是息息相关的。阅读是一个复杂的活动,就跟写作一样,包含了大量不同的活动。要达成良好的阅读,这些活动都是不可或缺的。一个人越能运作这些活动,阅读的效果就越好。
2.阅读的目标:为获得资讯而读,以及为求得理解而读
#
你有一个头脑。现在让我再假设你有一本想要读的书。这本书是某个人用文字书写的,想要与你沟通一些想法。你要能成功地阅读这本书,完全看你能接获多少作者想要传达的讯息。
当然,这样说太简单了。因为在你的头脑与书本之间可能会产生两种关系,而不是一种。阅读的时候有两种不同的经验可以象征这两种不同的关系。
这是书,那是你的头脑。你在阅读一页页的时候,对作者想要说的话不是很了解,就是不了解。如果很了解,你就获得了资讯(但你的理解不一定增强)。如果这本书从头到尾都是你明白的,那么这个作者跟你就是两个头脑却在同一个模子里铸造出来。这本书中的讯息只是将你还没读这本书之前,你们便共同了解的东西传达出来而已。
让我们来谈谈第二种情况。你并不完全了解这本书。让我们假设—不幸的是并非经常如此—你对这本书的了解程度,刚好让你明白其实你并不了解这本书。你知道这本书要说的东西超过你所了解的,因此认为这本书包含了某些能增进你理解的东西。
那你该怎么办?你可以把书拿给某个人,你认为他读得比你好的人,请他替你解释看不懂的地方。(“他”可能代表一个人,或是另一本书—导读的书或教科书。)或是你会决定,不值得为任何超越你头脑理解范围之外的书伤脑筋,你理解得已经够多了。不管是上述哪一种状况,你都不是本书所说的真正地在阅读。
只有一种方式是真正地在阅读。没有任何外力的帮助,你就是要读这本书。你什么都没有,只凭着内心的力量,玩味着眼前的字句,慢慢地提升自己,从只有模糊的概念到更清楚地理解为止。这样的一种提升,是在阅读时的一种脑力活动,也是更高的阅读技巧。这种阅读就是让一本书向你既有的理解力做挑战。
这样我们就可以粗略地为所谓的阅读艺术下个定义:这是一个凭借着头脑运作,除了玩味读物中的一些字句之外,不假任何外助,以一己之力来提升自我的过程。你的头脑会从粗浅的了解推进到深人的理解。而会产生这种结果的运作技巧,就是由许多不同活动所组合成的阅读的艺术。
凭着你自己的心智活动努力阅读,从只有粗浅的了解推进到深人的体会,就像是自我的破茧而出。感觉上确实就是如此。这是最主要的作用。当然,这比你以前的阅读方式要多了很多活动,而且不只是有更多的活动,还有要完成这些多元化活动所需要的技巧。除此之外,当然,通常需要比较高难度阅读要求的读物,都有其相对应的价值,以及相对应水平的读者。
为获得资讯而阅读,与为增进理解而阅读,其间的差异不能以道里计。我们再多谈一些。我们必须要考虑到两种阅读的目的。因为一种是读得懂的东西,另一种是必须要读的东西,二者之间的界限通常是很模糊的。在我们可以让这两种阅读目的区分开来的范围内,我们可以将“阅读”这个词,区分成两种不同的意义。
第一种意义是我们自己在阅读报纸、杂志,或其他的东西时,凭我们的阅读技巧与聪明才智,一下子便能融会贯通了。这样的读物能增加我们‘的资讯,却不能增进我们的理解力,因为在开始阅读之前,我们的理解力就已经与他们完全相当了。否则,我们一路读下来早就应该被困住或吓住了—这是说如果我们够诚实、够敏感的话。
第二种意义是一个人试着读某样他一开始并不怎么了解的东西。这个东西的水平就是比阅读的人高上一截。这个作者想要表达的东西,能增进阅读者的理解力。这种双方水准不齐之下的沟通,肯定是会发生的,否则,无论是透过演讲或书本,谁都永远不可能从别人身上学习到东西了。这里的“学习”指的是理解更多的事情,而不是记住更多的资讯—和你已经知道的资讯在同一水平的资讯。
对一个知识分子来说,要从阅读中获得一些和他原先熟知的事物相类似的新资讯,并不是很困难的事。一个人对美国历史已经知道一些资料,也有一些理解的角度时,他只要用第一种意义上的阅读,就可以获得更多的类似资料,并且继续用原来的角度去理解。但是,假设他阅读的历史书不只是提供给他更多资讯,而且还在他已经知道的资讯当中,给他全新的或更高层次的启发。也就是说,他从中获得的理解超越了他原有的理解。如果他能试着掌握这种更深一层的理解,他就是在做第二种意义的阅读了。他透过阅读的活动间接地提升了自己,当然,不是作者有可以教他的东西也达不到这一点。
在什么样的状况下,我们会为了增进理解而阅读?有两种状况:第一是一开始时不相等的理解程度。在对一本书的理解力上,作者一定要比读者来得“高杆”,写书时一定要用可读的形式来传达他有而读者所无的洞见。其次,阅读的人一定要把不相等的理解力克服到一定程度之内,虽然不能说全盘了解,但总是要达到与作者相当的程度。一旦达到相同的理解程度,就完成了清楚的沟通。
简单来说,我们只能从比我们“更高杆”的人身上学习。我们一定要知道他们是谁,如何跟他们学习。有这种想法的人,就是能认知阅读艺术的人,就是我们这本书主要关心的对象。而任何一个可以阅读的人,都有能力用这样的方式来阅读。只要我们努力运用这样的技巧在有益的读物上,每个人都能读得更好,学得更多,毫无例外。
我们并不想给予读者这样的印象:事实上,运用阅读以增加资讯与洞察力,与运用阅读增长理解力是很容易区分出来的。我们必须承认,有时候光是听别人转述一些讯息,也能增进很多的理解。这里我们想要强调的是:本书是关于阅读的艺术,是为了增强理解力而写的。幸运的是,只要你学会了这一点,为获取资讯而阅读的另一点也就不是问题了。
当然,除了获取资讯与理解外,阅读还有一些其他的目标,就是娱乐。无论如何,本书不会谈论太多有关娱乐消遣的阅读。那是最没有要求,也不需要太多努力就能做到的事。而且那样的阅读也没有任何规则。任何人只要能阅读,想阅读,就能找一份读物来消遣。
事实上,任何一本书能增进理解或增加资讯时,也就同时有了消遣的效果。就像一本能够增进我们理解力的书,也可以纯粹只读其中所包含的资讯一样。(这个情况并不是倒过来也成立:并不是每一种拿来消遣的书,都能当作增进我们的理解力来读。)我们也绝不是在鼓励你绝不要阅读任何消遣的书。重点在于,如果你想要读一本有助于增进理解力的好书,那我们是可以帮得上忙的。因此,如果增进理解力是你的目标,我们的主题就是阅读好书的艺术。
3.阅读就是学习:指导型的学习,以及自我发现型的学习之间的差异
#
吸收资讯是一种学习,同样地,对你以前不了解的事开始理解了,也是一种学习。但是在这两种学习当中,却有很重要的差异。
所谓吸收资讯,就只是知道某件事发生了。想要被启发,就是要去理解,搞清楚这到底是怎么回事:为什么会发生,与其他的事实有什么关联,有什么类似的情况,同类的差异在哪里等等。
如果用你记得住什么事情,和你解释得了什么事情之间的差异来说明,就会比较容易明白。如果你记得某个作者所说的话,就是你在阅读中学到了东西。如果他说的都是真的,你甚至学到了有关这个世界的某种知识。但是不管你学到的是有关这本书的知识或有关世界的知识,如果你运用的只是你的记忆力,其实你除了那些讯息之外一无所获。你并没有被启发。要能被启发,除了知道作者所说的话之外,还要明白他的意思,懂得他为什么会这么说。
当然,你可以同时记得作者所说的话,也能理解他话中的含义。吸收资讯是要被启发的前一个动作。无论如何,重点在不要止于吸收资讯而已。
蒙田说:“初学者的无知在于未学,而学者的无知在于学后。”第一种的无知是连字母都没学过,当然无法阅读。第二种的无知却是读错了许多书。英国诗人亚历山大·蒲伯(Alexander Pope)称这种人是书呆子,无知的阅读者。总有一些书呆子读得太广,却读不通。希腊人给这种集阅读与愚蠢于一身的人一种特别称呼,这也可运用在任何年纪、好读书却读不懂的人身上。他们就叫“半瓶醋"(Sophomores)。
要避免这样的错误—以为读得多就是读得好的错误—我们必须要区分出各种不同的阅读形态。这种区分对阅读的本身,以及阅读与一般教育的关系都有很重大的影响。
在教育史上,人们总是将经由指导的学习,与自我发现的学习区别出来。一个人用言语或文字教导另一个人时,就是一种被引导的学习。当然,没有人教导,我们也可以学习。否则,如果每一位老师都必须要人教导过,才能去教导别人,就不会有求知的开始了。因此,自我发现的学习是必要的—这是经由研究、调查或在无人指导的状况下,自己深思熟虑的一种学习过程。
自我发现的学习方式就是没有老师指导的方式,而被引导的学习就是要旁人的帮助。不论是哪一种方式,只有真正学习到的人才是主动的学习者。因此,如果说自我发现的学习是主动的,指导性的学习是被动的,很可能会造成谬误。其实,任何学习都不该没有活力,就像任何阅读都不该死气沉沉。
这是非常真确的道理。事实上,要区分得更清楚一些的话,我们可以称指导型的学习是“辅助型的自我发现学习”。用不着像心理学家作深人的研究,我们也知道教育是非常特殊的艺术,与其他两种学术—农业与医学—一样,都有极为重要的特质。医生努力为病人做许多事,但最终的结论是这个病人必须自己好起来—变得健康起来。农夫为他的植物或动物做了许多事,结果是这些动植物必须长大,变得更好。同样地,老师可能用尽了方法来教学生,学生却必须自己能学习才行。当他学习到了,知识就会在他脑中生根发芽。
指导型的学习与自我发现型的学习之间的差异—或是我们宁可说是在辅助型,及非辅助型的自我发现学习之间的差异—一个最基本的不同点就在学习者所使用的教材上。当他被指导时—在老师的帮助下自我发现时—学习者的行动立足于传达给他的讯息。他依照教导行事,无论是书写或口头的教导。他学习的方式就是阅读或倾听。在这里要注意阅读与倾听之间的密切关系。如果抛开这两种接收讯息方式之间的微小差异性,我们可以说阅读与倾听是同一种艺术—被教导的艺术。然而,当学习者在没有任何老师指导帮助下开始学习时,学习者则是立足于自然或世界,而不是教导来行动。这种学习的规范就构成了非辅助型的自我发现的学习。如果我们将“阅读”的含义放宽松一点,我们可以说自我发现型的学习—严格来说,非辅助型的自我发现学习—是阅读自我或世界的学习。就像指导型的学习(被教导,或辅助型的学习)是阅读一本书,包括倾听,从讲解中学习的一种艺术。
那么思考呢?如果“思考”是指运用我们的头脑去增加知识或理解力,如果说自我发现型的学习与指导型的学习是增加知识的惟二法门时,那么思考一定是在这两种学习当中都会出现的东西。在阅读与倾听时我们必须要思考,就像我们在研究时一定要思考。当然,这些思考的方式都不相同—就像两种学习方式之不同。
为什么许多人认为,比起辅助型学习,思考与非辅助型(或研究型)的自我发现学习更有关联,是因为他们假定阅读与倾听是丝毫不需要花力气的事。比起一个正在作研究发明的人,一个人在阅读资讯或消遣时,确实可能思考得较少一些。而这些都是比较被动的阅读方式。但对比较主动的阅读—努力追求理解力的阅读—来说,这个说法就不太正确了。没有一个这样阅读的人会说,那是丝毫不需要思考就能完成的工作。
思考只是主动阅读的一部分。一个人还必须运用他的感觉与想像力。一个人必须观察,记忆,在看不到的地方运用想像力。我们要再提一次,这就是在非辅助型的学习中经常想要强调的任务,而在被教导型的阅读,或倾听学习中被遗忘或忽略的过程。譬如许多人会假设一位诗人在写诗的时候一定要运用他的想像力,而他们在读诗时却用不着。简单地说,阅读的艺术包括了所有非辅助型自我发现学习的技巧:敏锐的观察、灵敏可靠的记忆、想像的空间,再者当然就是训练有素的分析、省思能力。这么说的理由在于:阅读也就是一种发现—虽然那是经过帮助,而不是未经帮助的一个过程。
4.老师的出席与缺席
#
一路谈来,我们似乎把阅读与倾听都当作是向老师学习的方式。在某种程度上,这确实是真的。两种方式都是在被指导,同样都需要被教导的技巧。譬如听一堂课就像读一本书一样,而听人念一首诗就跟亲自读到那首诗是一样的。在本书中所列举的规则跟这些经验都有关。但特别强调阅读的重要性,而将倾听当作第二顺位的考量,有很充分的理由。因为倾听是从一位出现在你眼前的老师学习—一位活生生的老师—而阅读却是跟一位缺席的老师学习。
如果你问一位活生生的老师一个问题,他可能会回答你。如果你还是不懂他说的话,你可以再问他问题,省下自己思考的时间。然而,如果你问一本书一个问题,你就必须自己回答这个问题。在这样的情况下,这本书就跟自然或世界一样。当你提出间题时,只有等你自己作了思考与分析之后,才会在书本上找到答案。
当然,这并不是说,如果有一位活生生的老师能回答你的问题,你就用不着再多做功课。如果你问的只是一件简单的事实的陈述,也许如此。但如果你追寻的是一种解释,你就必须去理解它,否则没有人能向你解释清楚。更进一步来说,一位活生生的老师出现在你眼前时,你从了解他所说的话,来提升理解力。而如果一本书就是你的老师的话,你就得一切靠自己了。
在学校的学生通常会跟着老师或指导者阅读比较困难的书籍。但对我们这些已经不在学校的人来说,当我们试着要读一本既非主修也非选修的书籍时,也就是我们的成人教育要完全依赖书籍本身的时候,我们就不能再有老师的帮助了。因此,如果我们打算继续学习与发现,我们就要懂得如何让书本来教导我们。事实上,这就是本书最主要的目的。
第二章 阅读的层次
#
在前一章里,我们说明了一些差异性的问题,这对接下来要说的事很重要。一位读者要追求的目标—为了消遣,获得资讯或增进理解力—会决定他阅读的方式。至于阅读的效果则取决于他在阅读上花了多少努力与技巧。一般来说,阅读的规则是:努力越多,效果越好。至少在阅读某些超越我们能力的书时,花一点力气就能让我们从不太了解进升到多一些了解的状态。最后,指导型与自我发现型学习(或辅助型与非辅助型自我发现学习)之间的区别之所以重要,因为我们大多数人在阅读时,都经常是没有人在旁边帮助的。阅读,就像是非辅助型的自我发现学习,是跟着一位缺席的老师在学习。只有当我们知道如何去读时,我们才可能真正读懂。
...
2025年1月7日 10:48 周二第四篇 阅读的最终目标
第二十章 阅读的第四个层次:主题阅读
#
到目前为止,我们还没有仔细谈过关于就同一个主题阅读两三本书的问题。我们在前面提到过,在讨论某个特定的主题时,牵涉到的往往不只是一本书。我们也一再非正式地提醒过,甚至其他领域中相关的作者与书籍,都与这个特定的主题有关。在作主题阅读时,第一个要求就是知道:对一个特定的问题来说,所牵涉的绝对不是一本书而已。第二个要求则是:要知道就总的来说,应该读的是哪些书?第二个要求比第一个要求还难做到。
我们在检验这个句子:“与同一个主题相关两本以上的书”时,困难就出现了。我们所说的“同一个主题”是什么意思?如果这个主题是单一的历史时期或事件,就很清楚了,但是在其他的领域中,就很难作这样清楚的区分。《飘》与《战争与和平》都是关于伟大战争的小说—但是,两者相似之处也止于此了。司汤达的《帕玛修道院》(The Charterhouse of Parma)谈的拿破仑战争,也是托尔斯泰作品中谈的战争。但是这两本书当然都不是在谈这场战争,也不是与一般战争有关的书。在这两个故事中,战争只是提供了一个环境或背景,故事的本身所谈的是人类的生存与挣扎,战争不过是作者想吸引读者注意的手法。我们可能会了解有关这场战役的一些事情—事实上,托尔斯泰就说过,从司汤达所描述的滑铁卢之役中,他学到很多有关这场战役的事—但是如果我们的主题是要研究战争,就用不着拿这些小说来读了。
你可能料到小说有这种情况。因为作品的特性,小说沟通问题的方法跟论说性作品不同。但是,论说性作品也有同样的问题。
譬如说你对“爱”这个概念很感兴趣,想要阅读相关的读物。因为关于爱的作品很广泛,你要整理出一个相关书目来阅读是有点困难的。假设你向专家求教,到一个完备的图书馆中寻找书目,还对照一位优秀学者所写的论文,终于把书目弄出来了。再假设你进一步舍弃诗人和小说家谈的这个主题,只想从论说性的作品中找答案(在后面我们会说明为什么这样的做法是明智的)。现在你开始依照书目来阅读这些书了。你发现什么?
即使只是匆匆的浏览,你也会找到一大堆相关的资料。人类的行为,几乎没有任何一种行为没有被称作是爱的行为—只是称呼的方式不同而已。而且爱并不只限于人类。如果你进一步往下阅读,你会发现宇宙中的万事万物皆有爱。也就是说,任何存在的事物都可能爱与被爱—或二者兼而有之。
石头是爱,因为它是地球的中心。火焰会上扬,是因为爱的功能。铁刀会吸引磁铁,被形容为爱的结果。有些书专门研究变形虫、草履虫、蜗牛、蚂蚁的爱情生活。更别提一些较高等的动物,它们会爱它们的主人,也会彼此相爱。谈到人类的爱,我们发现作者谈到也写到他们对男人们、女人们、一个男人、一个女人、孩子、他们自己、人类、金钱、艺术、家庭生活、原则、原因、职业或专业、冒险、安全、想法、乡村生活、爱的本身、牛排或美酒之爱。在某些教材中,天体的运转被认为是受到爱的启发。而天使与魔鬼的不同就在爱的品质不同。至于上帝,当然是要来爱人的。
面对如此庞大的相关资料,我们要如何决定我们要研究的主题是什么呢?我们能确定这中间只有一个单一的主题吗?当一个人说:“我爱起司。”另一个人说“我爱橄榄球。”而第三个人说“我爱人类”时,他们三个人所用的同样一个爱字,代表着同样的意义吗?毕竟,起司是可以吃的,橄榄球或人类是不能吃的。一个人可以玩橄榄球,却不能玩起司或其他的人。而不论“我爱人类”是什么意思,这个爱都与起司或橄榄球之爱不同。但是这三个人用的都是同样一个爱字。在这其中是否有深刻的理由?一些无法立即浮现的理由?就像这个问题本身的困难,在我们找到答案之前,我们能说我们已经确认了“同一个主题”吗?
面对如此的混乱,你可能会决定把范围缩小到人类的爱上—人与人之间的爱,同性爱或异性爱,同年之爱或忘年之爱等等。其中的规则又跟我们前面说的三种爱法不同了。但是就算你只读了一小部分与主题相关的书,你仍然会找到一堆的相关资料。譬如你会发现某些作者说:爱只是一种占有的欲望,通常是性的欲望,也就是说,爱只是一种所有动物在面对异性时会产生的吸引力。但是你也会发现另一个作者所谈的爱是不包含占有的欲望,而是一种慈善。如果说占有的欲望总是暗示着想要为自己追求好东西,而慈善却暗示着要为别人追求好东西。那么占有的欲望与慈善之间,是否有相通之处?
至少在占有的欲望与慈善之间,分享着一种共同的倾向,那就是渴望某种非常抽象的东西。但是你对这个主题的研究很快又让你发现:某些作者主张的爱是心灵的,而非肉欲的。这些作者认为爱是知性的行为,而非感性的行为。换句话说,知道某个人是值得仰慕的,总会引发渴望之心,不论是前面所说的哪一种渴望都行。这类作者并不否认有这样的渴望,但他们不承认那就是爱。
让我们假设—事实上,我们认为可以做得到—在这么多有关人类之爱的构想中,你能找出一些共通的意义。就算是这样,你的问题还是没有解决。再想想看,在人际之间,爱所表现出来的方式其实是截然不同的。男女之间的爱在恋爱期间、结婚之后、二十多岁时、七十多岁时都相同吗?一个女人对丈夫的爱与对孩子的爱相同吗?当孩子长大时,母亲对他们的爱就改变了吗?一个兄弟对姊妹的爱,跟他对父亲的爱是一样的吗?一个孩子长大之后,对父母的爱会改变吗?男人对女人的爱—无论是妻子或其他的女人—跟他对朋友的爱是相同的吗?他和不同朋友之间的关系—像是某人跟他一起打保龄球,某人是一起工作的伙伴,某人是知性的伙伴等—是否各有不同?“爱情”与“友情”之所以不同,是因为其中牵涉到的情绪(如果这是它们被命名的原因)不同,才有不同的名称吗?两个不同年纪的人也能做朋友吗?两个在财富与知识水平上有明显差距的人,也能做朋友吗?女人之间真的有友谊吗?兄弟姊妹,或哥哥弟弟、姊姊妹妹之间真的能成为朋友吗?如果你向人借钱,或是借钱给人,你们之间的友谊能保持下去吗?如果不能·,为什么?一个男孩子能爱上自己的老师吗?而这个老师是男是女,会不会造成什么样的差别?如果真的有像人一样的机器人,人类会爱他们吗?如果我们在火星或其他星球上发现了有智慧的生物,我们会爱他们吗?我们会不会爱上一个素昧平生的人,像是电影明星或总统?如果我们觉得恨某个人,那是否其实是一种爱的表现?
你只不过读了一小部分有关爱的论说性作品,这些问题就会浮现在你脑海中,其实还有更多其他的问题会出现。无论如何,我们已经说到重点了。在做主题阅读时,会出现一种很矛盾的现象。虽然这个层次的阅读被定义为就同一个主题,阅读两种以上的书,意思也是指在阅读开始之前,这个主题就已经被确认了,但是换个角度来说,这个主题也是跟着阅读走的,而不是事前就能定出来的。以爱这个例子来说,在你决定自己要读些什么之前,你可能已经读了好几百本相关的著作了。等你都读完之后,你会发现有一半的书其实跟主题根本无关。
1.在主题阅读中,检视阅读所扮演的角色
#
我们已经说过很多次,阅读的层次是渐进累积的。较高层次的阅读中也包括了前面的,或较低层次的阅读。在主题阅读中,我们就要说明这一点。
你可能还记得,在解说检视阅读与分析阅读的关系时,我们指出在检视阅读中的两个步骤—第一个是浏览,第二个是粗浅地阅读—也就是分析阅读的前两个步骤。浏览能帮助你准备做分析阅读的第一个步骤:你能确定自己在读的是什么主题,能说明这是什么样的书,并拟出大纲架构。粗浅的阅读对分析阅读的第一步骤也有帮助。基本上这是进人第二步骤的准备动作。在第二个步骤中,你要能够与作者达成共识,说明他的主旨,跟随他的论述,才能够诠释整本书的内容。
同样的,检视阅读与分析阅读也可以当作是进人主题阅读的前置作业或准备动作。事实上,在这个阶段,检视阅读已经是读者在阅读时主要的工具或手段了。
举例来说,你有上百本的参考书目,看起来全是与爱有关的主题。如果你全部用分析阅读来阅读,你不只会很清楚你在研究的主题是什么—主题阅读中的“同一主题”—你还会知道你所阅读的书中,那些跟主题无关,是你不需要的书。但是要用分析阅读将一百本书读完,.会花上你十年的时间。就算你能全心投注在这个研究上,仍然要花上好几个月的时间。再加上我们前面谈过的主题阅读中会出现的矛盾问题,显然必要有一些捷径。
这个捷径是要靠你的检视阅读技巧来建立的。你收集好书目之后,要做的第一件事是检视书单上所有的书。在做检视阅读之前,绝不要用分析阅读来阅读。检视阅读不会让你明白有关主题的所有错综复杂的内容,或是作者所有的洞察力,但却具有两种基本的功能。第一,它会让你对自己想要研究的主题有个清晰的概念,这样接下来你针对某几本书做分析阅读时,会大有助益。其次,它会简化你的书目到一个合理的程度。
对学生,尤其是研究生来说,我们很难想到还有比这更管用的方式。只要他们肯照着做,一定会有帮助。根据我们的经验,在研究生程度的学生中,确实有些人能做到主动的阅读与分析阅读。这对他们来说还不够,他们或许不是完美的读者,但是至少他们知道要如何掌握一本书的重点,能明确地说出书中的要点,并把这些观点纳人他们研究主题的一部分。但是他们的努力有一大半是浪费掉了,因为他们不知道要如何才能比别人读得快一点。他们阅读每一本书或每一篇文章都花上同样的时间与努力,结果他们该花精神好好阅读的书却没有读好,倒把时间花在那些不太值得注意的书上了。
能够熟练检视阅读的读者,不但能在心中将书籍分类,而且能对内容有一个粗浅的了解。他也会用非常短的时间就发现,这本书谈的内容对他研究的主题到底重不重要。这时他可能还不清楚哪些资料才是最重要的—这可能要等到读下本书的时候才能发现。但是有两件事至少他已经知道其中之一。那就是他不是发现这本书必须回头再读一次,以获得启发,便是知道不论这本书多有趣又多丰富,却毫无启发性,因此不值得重新再读。
这个忠告通常会被忽略是有原因的。我们说过,在分析阅读中,技巧熟练的阅读者可以同时用上许多技巧,而初学者却必须把步骤分开来。同样的,主题阅读的准备工作—先检视书目上所有的书,在开始做分析阅读之前先检视一遍—可以在做分析阅读时一并进行。但我们不相信任何读者能做到这一点,就算技巧再熟练也不行。这也是许多年轻研究生所犯的毛病。他们自以为两个步骤可以融合为一个,结果阅读任何书都用同样的速度,对某些特殊的作品来说不是太快就是太慢,但无论如何,对他们阅读的大部分书来说,这样的方法都是不对的。
一旦你检视过,确定某些书跟你研究的主题相关后,你就可以开始做主题阅读了。要注意的是,我们并没有像你以为的说:“开始做分析阅读”。当然,你需要研读每一本书,再组合起跟你主题相关的资料,你在做分析阅读时就已经学会了这些技巧。但是绝不要忘了,分析阅读的技巧只适用于单一的作品,主要的目标是要了解这本书。而我们会看到,主题阅读的目标却大不相同。
2.主题阅读的五个步骤
#
现在我们准备好要说明如何做主题阅读了。我们的假设是:你已经检视了相当多的书,你至少对其中一些书在谈些什么有点概念了,而且你也有想要研究的主题了。接下来你该怎么办?
在主题阅读中一共有五个步骤。这些步骤我们不该称之为规则—虽然也许我们会—因为只要漏掉其中一个步骤,主题阅读就会变得很困难,甚至读不下去了。我们会简略地介绍一下这些步骤的顺序,不过这些步骤彼此之间还是可以互相取代的。·
主题阅读步骤一:找到相关的章节。当然,我们假设你已经学会分析阅读了,如果你愿意,你能把所有相关的书都看透彻了。但是你可能会把阅读单本的书放在第一顺位,而把自己的主题放在其次。事实上,这个顺序应该颠倒过来,在主题阅读中,你及你关心的主题才是基本的重点,而不是你阅读的书。
在你已经确定哪些书是相关的之后,主题阅读的第一个步骤就是把这些书整体检视阅读一遍。你的目标是找出书中与你的主题极为相关的章节。你选择的书不太可能全本都与你的主题或问题相关。就算是如此,也一定是少数,你应该很快地把这本书读完。你不该忘了,你的阅读是别有用心的—也就是说,你是为了要解决自己的问题才阅读—而不是为了这本书本身的目的而阅读。
看起来,这个步骤似乎与前面所说的,为了发现这本书是否与你主题相关的检视阅读当同一件事来进行。许多状况的确可以这么做。但是如果你认为永远都可以这么做的话,可能就不太聪明了。记住,第一步的检视阅读是要集中焦点在你要进一步做主题阅读的主题上。我们说过,除非你已经检阅过书单上大部分的书,否则你无法完全理解这个问题。因此,在确认哪些是相关的书籍的同时,还要确认哪些是相关的章节,其实是很危险的做法。除非你的技巧已经很熟练,而且对你要研究的主题已经很清楚了,否则你最好是将两部分分开来做。
在主题阅读中,能够把你所阅读的第一批书,与你后来针对这个主题阅读的许多本书的差别区分出来,是很重要的事。对后来的这些书来说,你可能对自己的主题已经有了很清楚的概念,这时就可以把两种检视阅读合并在一起。但是在一开始时,却要明显地区分出来,否则你在找相关章节时会犯下严重的错误,到后来要更正这些错误时又要花上很多的时间与精力。
总之,要记得你最主要的工作不是理解整本书的内容,而是找出这本书对你的主题有什么帮助,而这可能与作者本身的写作目的相去甚远。在这个阶段的过程中,这并不重要。作者可能是在无意之间帮你解决了问题。我们已经说过,在主题阅读中,是书在服务你,而不是你在服务书。因此,主题阅读是最主动的一种阅读法。当然,分析阅读也需要主动的阅读方式。但是你在分析阅读一本书时,你就像是把书当作主人,供他使唤。而你在做主题阅读时,却一定要做书的主人。
因此,在与作者达成共识这一点上,这个阶段有不同的做法。
主题阅读步骤二:带引作者与你达成共识。在诠释阅读中(分析阅读的第二步骤),第一个规则是要你与作者达成共识,也就是要能找出关键字,发现他是如何使用这些字的。但是现在你面对的是许多不同的作者,他们不可能每个人都使用同样的字眼,或相同的共识。在这时候就是要由你来建立起共识,带引你的作者们与你达成共识,而不是你跟着他们走。
在主题阅读中,这可能是最困难的一个步骤。真正的困难在于要强迫作者使用你的语言,而不是使用他的语言。这跟我们一般的阅读习惯都不相同。我们也指出过很多次,我们假设:我们想要用分析阅读来阅读的作者,是比我们优秀的人。尤其如果这是一本伟大的著作时,就更可能如此。无论我们在了解他的过程中花了多少力气,我们都会倾向于接受他的词义与他安排的主题结构。但在主题阅读中,如果我们接受任何一位作者所提出来的词汇(terminology),我们很快就会迷失。我们可能会了解他的书,却无法了解别人的书。我们也很难找到与自己感兴趣的主题的资料。
我们不只要能够坚决拒绝接受任何一位作者的词汇,还得愿意面对可能没有任何一位作者的词汇对我们来说是有用的事实。换句话说,我们必须要接受一个事实:我们的词汇刚好与任何一位书目上的作者相同时,只是一种巧合。事实上,这样的巧合还满麻烦的。因为如果我们使用了某一位作者的一个或一组词义,我们就可能继续引用他书中其他的词义,而这只会带给我们麻烦,没有其他的帮助。
简单来说,主题阅读是一种大量的翻译工作。我们并不是将一种语言翻成另一种语言,像法语翻成英语,但是我们要将一种共通的词汇加诸在许多作者身上,无论他们所使用的是不是相同的语言,或是不是关心我们想解决的问题,是否创造了理想的词汇供我们使用。
这就是说,在进行主题阅读时,我们要建立一组词汇,首先帮助我们了解所有的作者,而不是其中一两个作者;其次帮助我们解决我们的问题。这一点认识会带我们进人第三个步骤。
主题阅读步骤三:厘清问题。诠释阅读的第二个规则是要我们找出作者的关键句子。然后从中逐步了解作者的主旨。主旨是由词义组成的,在主题阅读中,当然我们也要做同样的工作。但是因为这时是由我们自己来建立词汇,因此,我们也得建立起一组不偏不倚的主旨。最好的方法是先列出一些可以把我们的问题说得比较明白的问题,然后让那些作者来回答这些问题。
这也是很困难的工作,这些问题必须要以某种形式,某种秩序来说明,以帮助我们解决我们提出的问题,同时这些问题也要是大多数作者都能回答的问题。难就难在我们认为是问题的地方,作者也许并不认为是问题。他们对我们认定的主题可能有相当不同的看法。
事实上,有时候我们必须接受作者可能一个问题也回答不了。在这样的状况中,我们必须要将他视为是对这个问题保持沉默,或是尚未作出决定。但是就算他并没有很清楚地讨论这个问题,有时我们也可以在他书中找到间接的回答。我们会得出这么一个结论:如果他考虑到这个问题的话,那就会如何如何回答这个问题。在这里需要一点自我约束。我们不能把思想强加在作者脑海中,也不能把话语放进他们的口中。但是我们也不能完全依赖他们对这个问题的解说。如果我们真的能靠其中任何一位作者来解释这个问题,或许我们根本就没有问题要解决。
我们说过要把问题照秩序排列出来,好帮助我们在研究时使用。当然,这个秩序是跟主题有关的,不过还是有一般的方向可循。第一个问题通常跟我们在研究的概念或现象的存在或特质有关。如果一位作者说这种现象的确存在,或这种概念有一种特质,那么对于他的书我们就要提出更进一步的问题了。这个问题可能跟这个现象是如何被发现,或这个概念是如何表现出来的有关。最后一部分的问题则是与回答前面问题所产生的影响有关。
我们不该期望所有的作者都用同一种方法来回答我们的问题。如果他们这么做了,我们就又没有问题要解决了。那个问题会被一致的意见解决了。正因为每个作者都不相同,因此我们要再面对主题阅读的下一个步骤。
主题阅读步骤四:界定议题。如果一个问题很清楚,如果我们也确定各个作者会用不同的方式来回答—不论赞成或反对—那么这个议题就被定义出来了。这是介于用这种方法回答问题的作者,和用另外一种(可能是相反的)方法来回答问题的作者之间的议题。
如果检验过后,所有的作者提供的答案只有正反两面的意见,那么这个问题算是简单的问题。通常,对一个问题会有超过两种以上的答案。在这种情况下,我们就要找出不同意见彼此之间的关联,再根据作者的观点来作分类。
当两个作者对同一个问题有相当的了解,所作的回答却完全相反或矛盾时,这才是一个真正有参与的议题。但是这样的现象并不像我们希望的那样经常发生。通常,答案之不同固然来自于各人对这个主题有不同的观点,但也有很多情况是来自于对问题本身的认知不同。所以在做主题阅读的读者,要尽可能地确保议题是大家所共同参与的。有时候这会迫使他在列出问题的时候,小心不采取任何一位作者明白采用的方法。
我们要处理的问题,可能会出现很多种不同的议题,不过通常都可以分门别类。譬如像考虑到某种概念的特质的问题,就会出现一堆相关的议题。许多议题绕着一组相互关联密切的问题打转,就会形成这个主题的争议。这样的争议可能很复杂,这时主题阅读的读者就要将所有争议的前后关系整理清楚—尽管没有任何作者做这件事。厘清争议,同时将相关议题整理出来之后,我们便要进入主题阅读的最后一个步骤。
主题阅读步骤五:分析讨论。到目前为止,我们已经检验过作品,找出相关的章节,设定了一个不偏不倚的共识,适用于所有被检视过的作者,再设定出一整套的问题,其中大部分都能在作者的说明中找到答案。然后就不同的答案界定并安排出议题。接下来该怎么做呢?
前面四个步骤与分析阅读的前两组规则是互相辉映的。这些规则应用在任何一本书中,都会要我们回答一个问题:这本书在说些什么?是如何说明的?在主题阅读中,对于与我们的问题相关的讨论,我们也要回答类似的问题。在只阅读一本书的分析阅读中,剩下还有两个问题要回答:这是真实的吗?这与我何干?而在主题阅读中,我们对于讨论也要准备回答同样的问题。
让我们假设起头的那个阅读问题并不单纯,是个几世纪以来与许多思考者纷争不已的长久问题,许多人家不同意,并且会继续不同意的问题。在这个假设中,我们要认知的是,身为主题阅读的读者,我们的责任不只是要自己回答这些问题—这些问题是我们仔细整理出来,以便易于说明主题的本身与讨论的内容。有关这类问题的真理并不容易发现。如果我们期望真理就存在某一组问题的答案之中,那可能太轻率了。就算能找到答案,也是在一些相互矛盾的答案的冲突中找到令人信服的证据,而且有支持自己的确切理由。
因此,就可以发现的真理而言,就我们可以找到的问题答案而言,与其说是立足于任何一组主旨或主张上,不如说是立足于顺序清楚的讨论的本身。因此,为了要让我们的头脑接受这样的真相—也让别人接受—我们要多做一点工作,不只是问问题与回答问题而已。我们要依照特定的顺序来提问题,也要能够辨认为什么是这个顺序。我们必须说明这些问题的不同答案,并说明原因。我们也一定要能够从我们检视过的书中找出支持我们把答案如此分类的根据。只有当我们做到这一切时,我们才能号称针对我们问题的讨论作了分析,也才能号称真正了解了问题。
事实上,我们所做的可能超过这些。对一个问题完整地分析过后,将来其他人对同一个问题要作研究时,我们的分析讨论就会提供他一个很好的研究基础。那会清除一些障碍,理出一条路,让一个原创性的思考者能突破困境。如果没有这个分析的工作,就没法做到这一点,因为这个问题的各个层面就无法显现出来。
3.客观的必要性
#
要完整地分析一个问题或某个主题,得指出这个讨论中的主要议题,或是一些基本的知性反对立场。这并不是说在所有的讨论中,反对的意见总是占主导的。相反,同意或反对的意见总是互相并存的。也就是说,在大多数的议题中,正反两面的意见总是有几个,甚至许多作者在支持。在一个争议性的立场上,我们很少看到一个孤零零的支持者或反对者。
人类对任何领域某种事物的特质达成一致的观点,都建立一种假设,意味着他们共同拥有的意见代表着真理。而不同的观点则会建立起另一个相反的假设—无论你是否参与,这些争论中的观点可能没有一个是完全真实的。当然,在这些冲突的观点中,也可能有一个是完全真实的,而其他的则是虚假的。不过也可能双方面都只是表达了整体真理的一小部分。除了一些单调或孤立的争论之外(就我们在这里所读的问题,不太可能有这种形式的讨论),很可能正反双方的意见都是错的,一如所有的人可能都同意了一种错误的观点。而另一些没有表达出来的观点才可能是真实的,或接近真实的。
换句话说,主题阅读的目的,并不是给阅读过程中发展出来的问题提供最终答案,也不是给这个计划开始时候的问题提供最终解答。当我们要给这样的主题阅读写一份读者报告的时候,这个道理特别清楚。如果这份报告就任何所界定并分析过的重要议题,想要主张或证明某一种观点的真实或虚假,都会太过教条,失去对话的意义。如果这么做,主题阅读就不再是主题阅读,而只是讨论过程中的另一个声音,失去了疏离与客观性。
我们要说的,并不是我们认为对人类关心的重要议题多一个声音无足轻重。我们要说的是我们在追求理解的过程中,可以而且应该多贡献一种不同的形式。而这样的形式必须是绝对客观又公正的。主题阅读所追求的这种特质,可以用这句话来作总结:“辩证的客观。”
简单来说,主题阅读就是要能面面俱到,而自己并不预设立场。当然,这是个严格的理想,一般人是没法做到的。而绝对的客观也不是人类所能做到的事。他可能可以做到不预设立场,毫无偏见地呈现出任何观点,对不同的意见也保持中立。但是采取中立比面面俱到要容易多了。在这一方面,主题阅读的读者注定会失败的。一个议题有各种不同的观点,不可能巨细靡遗地全都列出来。虽然如此,读者还是要努力一试。
...
2025年1月7日 10:48 周二第三篇 阅读不同读物的方法
第十三章 如何阅读实用型的书
#
在任何艺术或实务的领域中,有些规则太通用这一点是很令人扫兴的。越通用的规则就越少,这算是一个好处。而越通用的规则,也越容易理解—容易学会与使用这些规则。但是,说实在的,当你置身错综复杂的实际情况,想要援用一些规则的时候,你也会发现越通用的规则离题越远。
我们前面谈过分析阅读的规则,一般来说是适用于论说性的作品—也就是说任何一种传达知识的书。但是你不能只用一般通用的方法来读任何一本书。你可能读这本书那本书,或是任何一种特殊主题的书,可能是历史、数学、政治论文或科学研究,或是哲学及神学理论,因此,在运用以下这些规则时,你一定要有弹性,并能随时调整。幸运的是,当你开始运用这些规则时,你会慢慢感觉到这些规则是如何在不同的读物上发挥作用。
要特别提醒的是,在第十一章结尾时所说明的十五个阅读规则并不适用于阅读小说或诗集。一本虚构作品的纲要架构,与论说性的作品是完全不同的。小说、戏剧与诗并不是照着共识、主旨、论述来发展的。换句话说,这些作品的基本内容没有逻辑可言,要评论这些作品也要有不同的前提才行。然而,如果你认为阅读富有想像力的作品毫无规则可言,那也是错的。事实上,下一章我们会讨论到阅读那种作品的另一套应用规则。那些规则一方面本身就很有效,另一方面如果能检验这些规则和阅读论说性作品规则的不同之处,还可以帮助你对阅读论说性作品的规则多一层认识。
你用不着担心又要学一整套十五个或更多的阅读小说与诗的规则。你会很容易了解到这两种规则之间的关联性。其中也包括了我们一再强调的事实,你在阅读时一定要能提出问题来,尤其是四个最特殊的问题,不论在阅读什么样的书时都要能提出来。这四个问题与任何一本书都有关,不论是虚构或非虚构,不论是诗、历史、科学或哲学。我们已经知道阅读论说性作品的规则如何互相连贯,又是如何从这四个问题中发展出来的。同样的,阅读富有想像力作品的规则也是来自这四个问题,只不过这两类作品的题材不同,会造成规则上的部分差异。
因此,在这一篇里,比起阅读的规则,我们会谈更多有关这几个问题的话题。我们会偶尔提一个新规则,也会重新调整某一个旧的规则。不过大多数时候,既然我们谈的是阅读不同读物的方法,我们会强调基本要问的不同问题,以及会获得什么样的不同的回答。
在论说性作品的部分,我们谈过基本上要区分出实用性与理论性,两种作品—前者是有关行动的问题,后者只和要传递的知识有关。我们也说过,理论性的作品可以进一步划分为历史、科学(与数学)、哲学。实用性作品则没有任何界限,因此我们要进一步分析这类书的特质,并提供一些阅读时的建议指南与方法。
1.两种实用性的书
#
关于实用性的书有一件事要牢记在心:任何实用性的书都不能解决该书所关心的实际问题。一本理论性的作品可以解决自己提出的问题。但是实际的问题却只能靠行动来解决。当你的实际问题是如何赚钱谋生时,一本教你如何交朋友或影响别人的书,虽然可能建议你很多事,但却不能替你解决问题。没有任何捷径能解决这个问题,只能靠你自己去赚钱谋生才能解决。
以本书为例。这是一本实用的书,如果你对这本书的实用性(当然也可能只是理论性)感兴趣,那你就是想要解决学习阅读的问题。但除非你真的学到了,你不可能认为那些问题都解决,消失不见了。本书没法为你解决那些问题,只能帮助你而已。你必须自己进行有活力的阅读过程,不只是读这本书,还要读很多其他的书。这也是为什么老话说:只有行动能解决问题。行动只能在现世发生,而不是在书本中发生。
每个行动发生时都有特殊情况,都发生在不同的时间、地点与特殊环境中。你没法照一般的反应来行动。要立即采取行动的特殊判断力,更是极为特别。这可以用文字来表达,却几乎没见过。你很难在书中找到这样的说明,因为实用书的作者不能亲身体验读者在面临的特殊状况时,必须采取的行动。他可能试着想要帮忙,但他不能提供现场的实际建议。只有另一个置身一模一样情况的人,才能帮得上忙。
然而,实用性的书多少还是可以提供一些可以应用在同类型特殊状况中的通用规则。任何人想要使用这样的书,一定要把这些规则运用在特殊的状况下,因此一定要练习特殊的判断力才行。换句话说,读者一定要能加上一点自己的想法,才能运用在实际的状况中。他要能更了解实际状况,更有判断力,知道如何将规则应用在这样的状况中。
任何书里包含了规则—原理、准则或任何一种一般的指导—你都要认定是一本实用性的书。但是一本实用性的书所包含的不只是规则而已。它可能会说明规则底下的原理,使之浅显易懂.譬如在这本与阅读有关的特殊主题的书中,我们不断地简要阐释文法、修辞与逻辑原理,来解说阅读规则。规则底下的原理通常都很科学,换言之,属于理论性的知识。规则与原理的结合,就是事物的理论。因此,我们谈造桥的理论,也谈打桥牌的理论。我们的意思是,理论性的原则会归纳出出色的行事规则。
实用性的书因此可分为两种类型。其中一种,就像本书一样,或是烹饪书、驾驶指南,基本上都是在说明规则的。无论其中谈论到什么问题,都是为了说明规则而来的。这类书很少有伟大的作品。另一类的 实用书主要是在阐述形成规则的原理。许多伟大的经济、政治、道德巨著就属于这一类。
这样的区分并不是绝对的。在一本书中,同时可以找到原理与规 则。重点在特别强调其中哪一项。要将这两种类型区分出来并不困 难。不管是在什么领域中,谈规则的书都可以立刻认出来是实用性的。 一本谈实用原理的书,乍看之下会以为是理论性的书。从某个程度来说,的确没错。它所讨论的是一种特殊状况中的理论。无论如何,你还是看得出来它是实用性的书。它要处理的那些问题的本质会露底。这样的书所谈的总是人类行为领域中,怎样可能做得更好或更糟。
在阅读一本以规则为主的书时,要找寻的主旨当然是那些规则。 阐述这些规则通常是用命令句,而不是叙述句。那是一种命令。譬如说:“及时一针,胜过事后九针。”这样的规则也可以改为叙述式的说法:“如果你及时补上一针,就省下后来要补的九针。”两个句子都是在提示 争取时间的价值,命令式的语句比较强烈,但却不见得就比较容易记住。
无论是叙述句或命令句,你总是能认出一个规则来,因为它在建议你某件事是值得做的,而且一定会有收获。因此,要你与作者达成共识的那条命令式的阅读规则,也可以改成建议式的说法:“成功的阅读牵涉到读者与作者达成共识。”“成功”这两个字就说明了一切,意味着这种阅读是值得去做的一件事。
这类实用书的论述都是在向你表示:它们所说的规则都是确切可 行的。作者可能会用原理来说明这些规则的可信度,或是告诉你一些实例,证明这些规则是可行的。看看这两种论述,诉诸原理的论述通常比较没有说服力,但却有一个好处。比起举实例的方法,诉诸原理的论述比较能将规则的理由说明得清楚一些。
在另一种实用性书中,主要谈的是规则背后的原理。当然,其中的主旨与论述看起来就跟纯理论性的书一模一样。其中的主旨是在说明某件事的状态,而论述就是在强调真的是如此。
但是阅读这样的一本书,与阅读纯理论的书还是有很大的不同。因为要解决的问题终究是实用的问题—行动的问题,人类在什么状态下可以做得更好或更糟的问题—所以当聪明的读者看到“实用原理”这样的书时,总是能读出言外之意。他可能会看出那些虽然没有明说,但却可以由原理衍生出来的规则。他还会更进一步,找出这些规则应该如何实际应用。
除非这样阅读,否则一本实用的书便没有被实用地阅读。无法让一本实用的书被实用地阅读,就是失败的阅读。你其实并不了解这本书,当然也不可能正确地评论这本书了。如果在原理中能找到可以理解的规则,那么也就可以在由原理引导出来的规则或建议的行动中,找到实用原理的意义。
这些是你要了解任何一种实用性书籍,或是在作某种批评时的最高原则。在纯理论性的书中,相同或反对的意见是与书中所谈的真理有关。但是现实的真理与理论的真理不同。行为规则要谈得上是真理,有两种情况:一是真的有效;二是这样做能带引你到正确的结果,达到你的期望。
假设作者认为你应该寻求的正确结果,你并不以为然,那么就算他的建议听起来很完整,由于那个目标的缘故,你可能还是不会同意他的观点。你会因此而判断他的书到底实不实用。如果你不认同仔细、头脑清楚地阅读是件值得做的事情,那么纵使本书的规则真的有效,这本书对你来说还是没什么实用性。
注意这段话的意义。在评断一本理论性的书时,读者必须观察他自己与作者之间的原理与假设的一致性或差异性。在评断一本实用性的书时,所有的事都与结果及目标有关。如果你不能分享马克思对经济价值的狂热,他的经济教条与改革措施对你来说就有点虚假或无关197痛痒。譬如你可能和埃德蒙·柏克(Edmund Burke)一样,认为维持现状就是最好的策略,而且在全面考量过后,你相信还有比改变资本不平等更重要的事。你的判断主要是与结果达成共识,而非方法。就算 方法非常真实有用,如果所达到的目的是我们不关心或不期望的结果, 我们也不会有半点兴趣的。
2.说服的角色
#
以上的简单讨论,可以给你一些线索。当你在阅读任何一种实用书时,一定要问你自己两个主要的问题。第一:作者的目的是什么?第二:他建议用什么方法达到这个目的?以原理为主的书要比以规则 为主的书还要难回答这两个问题。在这些书中,目的与方法可能都不很明显。但如果你想要了解与评论实用性的书,就必须回答这两个问题。
还要提醒你的是,前面我们讨论过的实用作品的写作问题。每一本实用的书中都混杂着雄辩或宣传。我们还没读过一本政治哲学的书—无论是多理论性的,无论谈的是多么“深奥”的原理—是不是想说服读者有关“最好的政府形态”的道理。相同的,道德理论的书也想 要说服读者有关“美好生活”的道理,同时建议一些达到目标的方法。我们也一直试着要说服你照某种特定的方式来阅读一本书,以达到你可能想要追求的理解力。
你可以知道为什么实用书的作者多少都是个雄辩家或宣传家。因为你对他作品最终的评断是来自你是否接受他的结论.与他提议的方法。这完全要看作者能不能将你引导到他的结论上。要这么做,他讨论的方法必须要能打动你的心智。他可能必须激起你的情绪反应,左右你的意志。
这并没有错,也没有恶意。这正是实用书的特性,一个人必须要被 说服,以采取特定的思想与行动。实际的思考与行动除了需要理智以 外,情感也是重要的因素。没有人可以没有受到感动,却认真采取实际 评论或行动的。如果可以的话,这个世界可能会比较美好,但一定是个不同的世界。一本实用书的作者认知不到这一点,就不算成功。一位读者如果认知不到这一点,就像买了一堆货物,却不知道自己买了些什么。
不想被宣传所困惑,就得了解宣传的内容是什么。难以察觉的隐藏式雄辩是最狡猾的。那会直接打动你的心,而不经过你的头脑,就像是从背后吓你一跳,把你吓得魂不附体一样。这样的宣传手法就像是你吞了一颗药,自己却完全不知道。宣传的影响力是很神秘的,事后你并不知道自己为什么会那样感觉与思考。
一个人如果真正读懂了一本实用的书,他知道这本书的基本共识、主旨、论述是什么,就能觉察出作者的雄辩。他会觉察到某一段话是“情绪用字”。他知道自己是被说服的对象,他有办法处理这些诉求的重点。他对推销有抵抗力,但并不是百分之百的需要。对推销有抵抗力是好的,能帮你避免在匆忙又欠考虑的情况下买东西。但是,一个读者如果完全不接受所有内容的诉求,那就不必阅读实用性的书了。
另外还有一个重点。因为实用问题的特性,也因为所有实用作品中都混杂了雄辩,作者的“性格”在实用书中就比理论书中还要来得重要。你在读一本数学用书时,用不着知道作者是谁。他的理论不是好就是坏,这跟他的人格怎样一点关系也没有。但是为了要了解与评断一本道德的论述、政治论文或经济论著,你就要了解一点作者的人格、生活与时代背景。譬如在读亚里士多德的《政治学》之前,就非常需要知道希腊的社会背景是奴隶制的。同样的,在读《君主论》之前,就要知道马基雅维里当时意大利的政治情况,与他跟美第奇家族的关系。因此,在读霍布斯的《利维坦》一书时,就要了解他生活在英国的内战时期,社会中充满暴力与混乱,使整个时代都沉浸在悲哀的病态之中。
3.赞同实用书之后
#
我们确定你已经看出来了,你在读一本书时要提出的四个问题,到了读实用性的书时有了一点变化。我们就来说明一下这些变化。
第一个问题:这本书是在谈些什么?并没有改变多少。因为一本实用的书是论说性的,仍然有必要回答这个问题,并作出这本书的大纲架构。
然而,虽然读任何书都得想办法找出一个作者的问题是什么(规则四涵盖这一点),不过在读实用性的书时,格外是一个决定性的关键。我们说过,你一定要了解作者的目的是什么。换句话说,你一定要知道他想解决的问题是什么。你一定要知道他想要做些什么—因为,在实用性的书中,知道他要做的是什么,就等于是知道他想要你做的是什么。这当然是非常重要的事了。
第二个问题的变化也不大。为了要能回答关于这本书的意义或内容,你仍然要能够找出作者的共识、主旨与论述。但是,这虽然是第二阶段最后的阅读工作(规则八),现在却显得更重要了。你还记得规则八要你说出哪些是作者已经解决的问题,哪些是还没有解决的问题。在阅读实用性的书籍时,这个规则就有变化了。你要发现并了解作者所建议的、达到他目标的方法。换句话说,在阅读实用性书时,如果规则四调整为:“找出作者想要你做什么。”规则八就该调整为:“了解他要你这么做的目的。”
第三个问题:内容真实吗?比前两个改变得更多了。在理论性作品中,当你根据自己的知识来比较作者对事物的描绘与说明时,这个问题的答案便出来了。如果这本书所描述的大致与你个人的体验相似时,你就必须承认那是真实的,或至少部分是真实的。实用性的书,虽然也会与真实作比较,但最主要的却是你能不能接受作者的宗旨—他最终的目标,加上他建议的达成目标的方法—这要看你认为追求的是什么,以及什么才是最好的追求方法而定。
第四个问题:这本书与我何干?可说全部改变了。如果在阅读一本理论性的书之后,你对那个主题的观点多少有点变化了,你对一般事物的看法也就会多少有些调整。(如果你并不觉得需要调整,可能你并没有从那本书中学到什么。)但是这样的调整并不是惊天动地的改变,毕竟,这些调整并不一定需要你探取行动。
赞同一本实用性的书,却确实需要你采取行动。如果你被作者说服了,他所提议的结论是有价值的,甚至进一步相信他的方法真的能达到目的,那就很难拒绝作者对你的要求了。你会照着作者希望你做的方式来行动。
当然,我们知道这种情形并不一定会发生。但我们希望你了解的是,如果你不这样做的话,到底代表什么意思。那就表示虽然这个读者表面上同意了作者的结论,也接受了他提出来的方法,但是实际上并没有同意,也没有接受。如果他真的都同意也接受了,他没有理由不采取行动。
我们用一个例子来说明一下。如果读完本书的第二部分,你(1)同意分析阅读是值得做的。(2)接受这些阅读规则,当作是达到目标的基本要件,你会像我们现在所说的一样,开始照着阅读起来。如果你没有这么做,可能并不是你偷懒或太累了,而是你并不真的同意(1)或(2)。
在这个论述中有一个明显的例外。譬如你读了一篇文章,是关于如何做巧克力慕斯的。你喜欢巧克力慕斯,也赞同这个作者的结论是对的。你也接受了这个作者所建议的达到目标的方法—他的食谱。但你是男性读者,从不进厨房,也没做过慕斯。在这样的情况中,我们的观点是否就不成立了?
并不尽然。这正好显示出我们应该要提到的,区分各种类型实用书的重要性。某些作者提出的结论是很通用或一般性的—可供所有的人类使用—另外一些作者的结论却只有少数人能运用。如果结论是通用的—譬如像本书,所谈的是使所有人都能阅读得更好,而不是只有少数人—那么我们所讨论的便适用于每位读者。如果结论是经过筛选的,只适用于某个阶层的人,那么读者便要决定他是否属于那个阶层了。如果他属于那个阶层,这些内容就适合他应用,他多少也有义务照作者的建议采取行动。如果他不属于这个阶层,他可能就没有这样的义务。
...
2025年1月7日 10:48 周二第二篇 阅读的第三个层次:分析阅读
第六章 一本书的分类
#
在本书的一开头,我们就已经说过了,这些阅读的规则适用于任何你必须读或想要读的读物。然而,在说明分析阅读,也就是这第二篇的内容中,我们却似乎要忽略这个原则。我们所谈的阅读,就算不全是,也经常只是指“书”而言。为什么呢?
答案很简单。阅读一整本书,特别是又长又难读的一本书,要面对的是一般读者很难想像,极为艰困的问题。阅读一篇短篇故事,总比读一本小说来得容易。阅读一篇文章,总比读一整本同一个主题的书籍来得轻松。但是如果你能读一本史诗或小说,你就能读一篇抒情诗或短篇故事。如果你能读一本理论的书—一本历史、哲学论述或科学理论—你就可以读同一个领域中的一篇文章或摘要。
因此,我们现在要说的阅读技巧,也可以应用在其他类型的读物上。你要了解的是,当我们提到读书的时候,所说明的阅读规则也同样适用于其他比较易于阅读的资料。虽然这些规则程度不尽相当,应用在后者身上时,有时候作用不尽相同,但是只要你拥有这些技巧,懂得应用,总可以比较轻松。
1.书籍分类的重要性
#
分析阅读的第一个规则可以这么说:规则一,你一定要知道自己在读的是哪一类书,而且要越早知道越好。最好早在你开始阅读之前就先知道。
譬如,你一定要知道,在读的到底是虚构的作品—小说、戏剧、史诗、抒情诗—还是某种论说性的书籍?几乎每个读者在看到一本虚构的小说时都会认出来,所以就会认为要分辨这些并不困难—其实不然。像《波特诺的牢骚》(Portnoy’s、Complaint),是小说还是心理分析的论著?《裸体午宴)(Naked Lunch)是小说,还是反对药物泛滥的劝导手册,像那些描述酒精的可怕,以帮助读者戒酒之类的书?《飘》(Gone With The Wind)是爱情小说,还是美国内战时期的南方历史?《大街》(Main Street)与《愤怒的葡萄))(The Grapes o f Wrath),一本都会经验,一本农村生活,到底是纯文学,还是社会学的论著?
当然,这些书都是小说,在畅销书排行榜上,都是排在小说类的。但是问这些问题并不荒谬。光是凭书名,像《大街》或《米德尔顿》,很难猜出其中写的是小说,还是社会科学论述。在当代的许多小说中,有太多社会科学的观点,而社会科学的论著中也有很多小说的影子,实在很难将二者区别开来。但是还有另一些科学—譬如物理及化学—出现在像是科幻小说《安珠玛特病毒》(The Andromeda Strain),或是罗伯特·海莱因(Robert Heinlein)、亚瑟·克拉克(Arthur C. Clarke)的书中。而像《宇宙与爱因斯坦博士》(The Universe and Dr. Einstein)这本书,明明不是小说,却几乎跟有“可读性”的小说一模一样。或许就像福克纳(William Faulkner)所说的,这样的书比其他的小说还更有可读性。
一本论说性的书的主要目的是在传达知识。“知识”在这样的书中被广泛地解说着。任何一本书,如果主要的内容是由一些观点、理论、假设、推断所组成,并且作者多少表示了这些主张是有根据的,有道理的,那这种传达知识的书,就是一本论说性(expository)的书。就跟小说一样,大多数人看到论说性的书也一眼就能辨识出来。然而,就像要分辨小说与非小说很困难一样,要区别出如此多样化的论说性书籍也并非易事。我们要知道的不只是哪一类的书带给我们指导,还要知道是用什么方法指导。历史类的书与哲学类的书,所提供的知识与启发方式就截然不同。在物理学或伦理学上,处理同一个问题的方法可能也不尽相同。更别提各个不同作者在处理这么多不同问题时所应用的各种不同方法了。
因此,分析阅读的第一个规则,虽然适用于所有的书籍,却特别适合用来阅读非小说,论说性的书。你要如何运用这个规则呢?尤其是这个规则的最后那句话?
之前我们已经建议过,一开始时,你要先检视这本书—用检视阅读先浏览一遍。你读读书名、副标题、目录,然后最少要看看作者的序言、摘要介绍及索引。如果这本书有书衣,要看看出版者的宣传文案。这些都是作者在向你传递讯号,让你知道风朝哪个方向吹。如果你不肯停、看、听,那也不是他的错。
2.从一本书的书名中你能学到什么
#
对于作者所提出的讯号视而不见的读者,比你想像中还要多得多。我们跟学生在一起,就已经一再感觉如此了。我们问他们这本书在说些什么?我们要他们用最简单的通常用语,告诉我们这本书是哪一类的书。这是很好的,也是要开始讨论一本书几乎必要的方式。但是,我们的问题,却总是很难得到任何答案。
我们举一两个这种让人困扰的例子吧!1859年,达尔文(CharlesDarwin)出版了一本很有名的书。一个世纪之后,所有的英语国家都在庆贺这本书的诞生。这本书引起无止境的争论,不论是从中学到一点东西,还是没学到多少东西的评论者,一致肯定其影响力。这本书谈论的是人类的进化,书名中有个“种"(species)字。到底这个书名在说些什么?
或许你会说那是《物种起源))(The Origin of Species),这样说你就对了。但是你也可能不会这样说,你可能会说那是《人种起源》(TheOrigin of the Species).最近我们问了一些年纪在25岁左右,受过良好教育的年轻人,到底达尔文写的是哪一本书,结果有一半以上的人说是《人种起源》。出这样的错是很明显的,他们可能从来没有读过那本书,只是猜想那是一本谈论人类种族起源的书。事实上,这本书跟这个主题只有一点点关联,甚至与此毫无关系。达尔文是在后来才又写了一本与此有关的书《人类始祖》(The Descent of Man)。《物种起源》,就像书名所说的一样,书中谈的是自然世界中,大量的植物、动物一开始是从少量的族群繁衍出来的,因此他声明了“物竞天择”的原理。我们会指出这个普遍的错误,是因为许多人以为他们知道这本书的书名,而事实上只有少之又少的人真的用心读过书名,也想过其中的含意。
再举一个例子。在这个例子中,我们不要你记住书名,但去想想其中的含意。吉朋写了一本很有名的书,而且还出名地长,是一本有关罗马帝国的书,他称这本书为《罗马帝国衰亡史》。几乎每个人拿到那本书都会认得这个书名,还有很多人即使没看到书,也知道这个书名。事实上,“衰亡”已经变成一个家喻户晓的用语了。虽然如此,当我们问到同样一批二十五岁左右,受过良好教育的年轻人,为什么第一章要叫做:《安东尼时代的帝国版图与武力》时,他们却毫无头绪。他们并没有看出整本书的书名既然叫作“衰亡史”,叙事者当然就应该从罗马帝国极盛时期开始写,一直到帝国衰亡为止。他们无意识地将“衰亡”两个字转换成“兴亡”了。他们很困惑于书中并没有提到罗马共和国,那个在安东尼之前一个半世纪就结束的时代。如果他们将标题看清楚一点,就算以前不知道,他们也可以推断安东尼时代就是罗马帝国的巅峰时期。阅读书名,换句话说,可以让阅读者在开始阅读之前,获得一些基本的资讯。但是他们不这么做,甚至更多人连不太熟悉的书也不肯看一下书名。
许多人会忽略书名或序言的原因之一是,他们认为要将手边阅读的这本书做分类是毫无必要的。他们并没有跟着分析阅读的第一个规则走。如果他们试着跟随这个规则,那就会很感激作者的帮忙。显然,作者认为,让读者知道他在写的是哪一类的书是很重要的。这也是为什么他会花那么多精神,不怕麻烦地在前言中做说明,通常也试着想要让他的书名—至少副标题—是让人能理解的。因此,爱因斯坦与英费尔德(Infeld)在他们所写的《物理之演进(The Evolution o fPhysics)一书的前言中告诉读者,他们写的是一本“科学的书,虽然很受欢迎,但却不能用读小说的方法来读”。他们还列出内容的分析表,提醒读者进一步了解他们概念中的细节。总之,列在一本书前面那些章节的标题,可以进一步放大书名的意义。
如果读者忽略了这一切,却答不出“这是一本什么样的书”的问题,那他只该责怪自己了。事实上,他只会变得越来越困惑。如果他不能回答这个问题,如果他从没问过自己这个问题,他根本就不可能回答随之而来的,关于这本书的其他问题。
阅读书名很重要,但还不够。除非你能在心中有一个分类的标准,否则世上再清楚的书名,再详尽的目录、前言,对你也没什么帮助。
如果你不知道心理学与几何学都是科学,或者,如果你不知道这两本书书名上的“原理”与“原则”是大致相同的意思(虽然一般而言不尽相同),你就不知道欧几里得(Euclid)的《几何原理》(Elements of Geometry)与威廉·詹姆斯(William James)的《心理学原理》(Principlesof Psychology)是属于同一种类的书—此外,除非你知道这两本书是不同类型的科学,否则就也无法进一步区分其间的差异性。相同的,以亚里士多德的《政治学))(The Politics)与亚当·斯密的《国富论》为例,除非你了解一个现实的问题是什么,以及到底有多少不同的现实问题,否则你就无法说出这两本书相似与相异之处。
书名有时会让书籍的分类变得比较容易一些。任何人都会知道欧几里得的《几何原理》、笛卡尔的《几何学》(Geometry)与希尔伯特(HilBert)的《几何基础)(Foundations of Geometry)都是数学的书,彼此多少和同一个主题相关。但这不是百试百中。光是从书名,也可能并不容易看出奥古斯丁的《上帝之城》(The City of God)、霍布斯的《利维坦》(Leviathan)与卢梭的《社会契约论》(Social Contract)都是政治的论述—虽然,如果仔细地阅读这三本书的章名,会发现它们都想探讨的一些共同问题。
...
2025年1月5日 19:17 周日数据库和文件系统的工具
#
数据目录的结构
#
表在文件系统中的表示
#
kjskfjksdf
s ksfd
InnoDB是如何存储表数据的1
#
系统表空间1
#
撒旦发就
系统表空间2
#
撒旦发就
系统表空间3
#
撒旦发就
InnoDB是如何存储表数据的2
#
2025年1月5日 08:42 周日
内容简介
本书是MySQL领域的经典之作,拥有广泛的影响力。第3版更新了大量的内容,不但涵盖了最新MySQL 5.5版本的新特性,也讲述了关于固态盘、高可扩展性设计和云计算环境下的数据库相关的新内容,原有的基准测试和性能优化部分也做了大量的扩展和补充。全书共分为16章和6个附录,内容涵盖MySQL架构和历史,基准测试和性能剖析,数据库软硬件性能优化,复制、备份和恢复,高可用与高可扩展性,以及云端的MySQL和MySQL相关工具等方面的内容。每一章都是相对独立的主题,读者可以有选择性地单独阅读。
本书不但适合数据库管理员(DBA)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。
©2012 by Baron Schwartz,Peter Zaitsev,Vadim Tkachenko.
Simplified Chinese Edition,jointly published by O’Reilly Media,Inc. and Publishing House of Electronics Industry,2013. Authorized translation of the English edition,2012 O’Reilly Media,Inc.,the owner of all rights to publish and sell the same.
All rights reserved including the rights of reproduction in whole or in part in any form.
本书简体中文版专有出版权由O’Reilly Media,Inc.授予电子工业出版社。未经许可,不得以任何方式复制或抄袭本书的任何部分。专有出版权受法律保护。
版权贸易合同登记号图字:01-2013-1661
图书在版编目(CIP)数据
高性能MySQL:第3版/(美)施瓦茨(Schwartz,B.),(美)扎伊采夫(Zaitsev,P.),(美)特卡琴科(Tkachenko,V.)著;宁海元等译.—北京:电子工业出版社,2013.5
书名原文:High Performance MySQL,Third Edition
ISBN 978-7-121-19885-4
...
2025年1月5日 08:42 周日第9章 操作系统和硬件优化
MySQL服务器性能受制于整个系统最薄弱的环节,承载它的操作系统和硬件往往是限制因素。磁盘大小、可用内存和CPU资源、网络,以及所有连接它们的组件,都会限制系统的最终容量。因此,需要小心地选择硬件,并对硬件和操作系统进行合适的配置。例如,若工作负载是I/O密集型的,一种方法是设计应用程序使得最大限度地减少MySQL的I/O操作。然而,更聪明的方式通常是升级I/O子系统,安装更多的内存,或重新配置现有的磁盘。
硬件的更新换代非常迅速,所以本章有关特定产品或组件的内容可能将很快变得过时。像往常一样,我们的目标是帮助提升对这些概念的理解,这样对于即使没有直接覆盖到的知识也可以举一反三。这里我们将通过现有的硬件来阐明我们的观点。
9.1 什么限制了MySQL的性能
#
许多不同的硬件都可以影响MySQL的性能,但我们认为最常见的两个瓶颈是CPU和I/O资源。当数据可以放在内存中或者可以从磁盘中以足够快的速度读取时,CPU可能出现瓶颈。把大量的数据集完全放到大容量的内存中,以现在的硬件条件完全是可行的(1)。
另一方面,I/O瓶颈,一般发生在工作所需的数据远远超过有效内存容量的时候。如果应用程序是分布在网络上的,或者如果有大量的查询和低延迟的要求,瓶颈可能转移到网络上,而不再是磁盘I/O(2)。
第3章中提及的技巧可以帮助找到系统的限制因素,但即使你认为已经找到了瓶颈,也应该透过表象去看更深层次的问题。某一方面的缺陷常常会将压力施加在另一个子系统,导致这个子系统出问题。例如,若没有足够的内存,MySQL可能必须刷出缓存来腾出空间给需要的数据——然后,过了一小会,再读回刚刚刷新的数据(读取和写入操作都可能发生这个问题)。本来是内存不足,却导致出现了I/O容量不足。当找到一个限制系统性能的因素时,应该问问自己,“是这个部分本身的问题,还是系统中其他不合理的压力转移到这里所导致的?”在第3章的诊断案例中也有讨论到这个问题。
还有另外一个例子:内存总线的瓶颈也可能表现为CPU问题。事实上,我们说一个应用程序有“CPU瓶颈”或者是“CPU密集型”,真正的意思应该是计算的瓶颈。接下来将深入探讨这个问题。
9.2 如何为MySQL选择CPU
#
在升级当前硬件或购买新的硬件时,应该考虑下工作负载是不是CPU密集型。
可以通过检查CPU利用率来判断是否是CPU密集型的工作负载,但是仅看CPU整体的负载是不合理的,还需要看看CPU使用率和大多数重要的查询的I/O之间的平衡,并注意CPU负载是否分配均匀。本章稍后讨论的工具可以用来弄清楚是什么限制了服务器的性能。
9.2.1 哪个更好:更快的CPU还是更多的CPU
#
当遇到CPU密集型的工作时,MySQL通常可以从更快的CPU中获益(相对更多的CPU)。
但这不是绝对的,因为还依赖于负载情况和CPU数量。更古老的MySQL版本在多CPU上有扩展性问题,即使新版本也不能对单个查询并发利用多个CPU。因此,CPU速度限制了每个CPU密集型查询的响应时间。
当我们讨论CPU的时候,为保证本文易于阅读,对某些术语将不会做严格的定义。现在一般的服务器通常都有多个插槽(Socket),每个插槽上都可以插一个有多个核心的CPU(有独立的执行单元),并且每个核心可能有多个“硬件线程”。这些复杂的架构需要有点耐心去了解,并且我们不会总是明确地区分它们。不过,在一般情况下,当谈到CPU速度的时候,谈论的其实是执行单元的速度,当提到的CPU数量时,指的通常是在操作系统上看到的数量,尽管这可能是独立的执行单元数量的多倍(3)。
这几年CPU在各个方面都有了很大的提升。例如,今天的Intel CPU速度远远超过前几代,这得益于像直接内存连接(directly attached memory)技术以及PCIe卡之类的设备互联上的改善等。这些改进对于存储设备尤其有效,例如Fusion-io和Virident的PCIe闪存驱动器。
超线程的效果相比以前也要好得多,现在操作系统也更了解如何更好地使用超线程。而以前版本的操作系统无法识别两个虚拟处理器实际上是在同一芯片上,认为它们是独立的,于是会把任务安排在两个实际上是相同物理执行单元上的虚拟处理器。实际上单个执行单元并不是真的可以在同一时间运行两个进程,所以这样做会发生冲突和争夺资源。而同时其他CPU却可能在闲置,从而浪费资源。操作系统需要能感知超线程,因为它必须知道什么时候执行单元实际上是闲置的,然后切换相应的任务去执行。这个问题之前常见的原因是在等待内存总线,可能花费需要高达一百个CPU周期,这已经类似于一个轻量级的I/O等待。新的操作系统在这方面有了很大的改善。超线程现在已经工作得很好。过去,我们时常提醒人们禁用它,但现在已经不需要这样做了。
这就是说,现在可以得到大量的快速的CPU——比本书的第2版出版的时候要多得多。所以多和快哪个更重要?一般来说两个都想要。从广义上来说,调优服务器可能有如下两个目标:
低延时(快速响应)
要做到这一点,需要高速CPU,因为每个查询只能使用一个CPU。
高吞吐
如果能同时运行很多查询语句,则可以从多个CPU处理查询中受益。然而,在实践中,还要取决于具体情况。因为MySQL还不能在多个CPU中完美地扩展,能用多少个CPU还是有极限的。在旧版本的MySQL中(MySQL 5.1以后的版本已经有一些提升),这个限制非常严重。在新的版本中,则可以放心地扩展到16或24个CPU,或者更多,取决于使用的是哪个版本(Percona往往在这方面略占优势)。
如果有多路CPU,并且没有并发执行查询语句,MySQL依然可以利用额外的CPU为后台任务(例如清理InnoDB缓冲、网络操作,等等)服务。然而,这些任务通常比执行查询语句更加轻量化。
MySQL复制(将在下一章中讨论)也能在高速CPU下工作得非常好,而多CPU对复制的帮助却不大。如果工作负载是CPU密集型,主库上的并发任务传递到备库以后会被简化为串行任务,这样即使备库硬件比主库好,也可能无法保持跟主库之间的同步。也就是说,备库的瓶颈通常是I/O子系统,而不是CPU。
如果有一个CPU密集型的工作负载,考虑是需要更快的CPU还是更多CPU的另外一个因素是查询语句实际在做什么。在硬件层面,一个查询可以在执行或等待。处于等待状态常见的原因是在运行队列中等待(进程已经是可运行状态,但所有的CPU都忙)、等待闩锁(Latch)或锁(Lock)、等待磁盘或网络。那么你期望查询是等待什么呢?如果等待闩锁或锁,通常需要更快的CPU;如果在运行队列中等待,那么更多或者更快的CPU都可能有帮助。(也可能有例外,例如,查询等待InnoDB日志缓冲区的Mutex,直到I/O完成前都不会释放——这可能表明需要更多的I/O容量)。
这就是说,MySQL在某些工作负载下可以有效地利用很多CPU。例如,假设有很多连接查询的是不同表(假设这些查询不会造成表锁的竞争,实际上对MyISAM和MEMORY表可能会有问题),并且服务器的总吞吐量比任何单个查询的响应时间都更重要。吞吐量在这种情况下可以非常高,因为线程可以同时运行而互不争用。
再次说明,在理论上这可能更好地工作:不管查询是读取不同的表还是相同的表, InnoDB都会有一些全局共享的数据结构,而MyISAM在每个缓冲区都有全局锁。而且不仅仅是存储引擎,服务器层也有全局锁。以前InnoDB承担了所有的骂名,但最近做了一些改进后,暴露了服务器层中的其他瓶颈。例如臭名昭著的LOCK_open互斥量(Mutex),在MySQL 5.1和更早版本中可能就是个大问题,另外还有其他一些服务器级别的互斥量(例如查询缓存)。
通常可以通过堆栈跟踪来诊断这些类型的竞争问题,例如Percona Toolkit中的pt-pmp工具。如果遇到这样的问题,可能需要改变服务器的配置,禁用或改变引起问题的组件,进行数据分片(Sharding),或者通过某种方式改变做事的方法。这里无法列举所有的问题和相应的解决方案,但是一旦有一个确定的诊断,答案通常是显而易见的。大部分不幸遇到的问题都是边缘场景,最常见的问题随着时间的推移都在服务器上被修复了。
9.2.2 CPU架构
#
可能99%以上的MySQL实例(不含嵌入式使用)都运行在Intel或者AMD芯片的x86架构下。本书中我们基本都是针对这种情况。
64位架构现在都是默认的了,32位CPU已经很难买到了。MySQL在64位架构上工作良好,尽管有些事暂时不能利用64位架构来做。因此,如果使用的是较老旧版本的MySQL,在64位服务器上可能要小心。例如,在MySQL 5.0发布的早期时候,每个MyISAM键缓冲区被限制为4 GB,由一个32位整数负责寻址。(可以创建多个键缓冲区来解决这个问题。)
确保在64位硬件上使用64位操作系统!最近这种情况已经不太常见了,但以前经常可以遇到,大多数主机托管提供商暂时还是在服务器上安装32位操作系统,即使是64位CPU。32位操作系统意味着不能使用大量的内存:尽管某些32位系统可以支持大量的内存,但不能像64位系统一样有效地利用,并且在32位系统上,任何一个单独的进程都不能寻址4 GB以上的内存。
9.2.3 扩展到多个CPU和核心
#
多CPU在联机事务处理(OLTP)系统的场景中非常有用。这些系统通常执行许多小的操作,并且是从多个连接发起请求,因此可以在多个CPU上运行。在这样的环境中,并发可能成为瓶颈。大多数Web应用程序都属于这一类。
OLTP服务器一般使用InnoDB,尽管它在多CPU的环境中还存在一些未解决的并发问题。然而,不只是InnoDB可能成为瓶颈:任何共享资源都是潜在的竞争点。InnoDB之所以获得大量关注是因为它是高并发环境下最常见的存储引擎,但MyISAM在大压力时的表现也不好,即使不修改任何数据只是读取数据也是如此。许多并发瓶颈,如InnoDB的行级锁和MyISAM的表锁,没有办法优化——除了尽可能快地处理任务之外,没有别的办法解决,这样,锁就可以尽快分配给等待的任务。如果一个锁是造成它们(其他任务)都在等待的原因,那么不管有多少CPU都一样。因此,即使是一些高并发工作负载,也可以从更快的CPU中受益。
实际上有两种类型的数据库并发问题,需要不同的方法来解决,如下所示。
逻辑并发问题
应用程序可以看到资源的竞争,如表或行锁争用。这些问题通常需要好的策略来解决,如改变应用程序、使用不同的存储引擎、改变服务器的配置,或使用不同的锁定提示或事务隔离级别。
内部并发问题
比如信号量、访问InnoDB缓冲池页面的资源争用,等等。可以尝试通过改变服务器的设置、改变操作系统,或使用不同的硬件解决这些问题,但通常只能缓解而无法彻底消灭。在某些情况下,使用不同的存储引擎或给存储引擎打补丁,可以帮助缓解这些问题。
MySQL的“扩展模式”是指它可以有效利用的CPU数量,以及在压力不断增长的情况下如何扩展,这同时取决于工作负载和系统架构。通过“系统架构”的手段是指通过调整操作系统和硬件,而不是通过优化使用MySQL的应用程序。CPU架构(RISC、CISC、流水线深度等)、CPU型号和操作系统都影响MySQL的扩展模式。这也是为什么说基准测试是非常重要的:一些系统可以在不断增加的并发下依然运行得很好,而另一些的表现则糟糕得多。
有些系统在更多的处理器下甚至可能降低整体性能。这是相当普遍的情况,我们了解到许多人试图升级到有多个CPU的系统,最后只能被迫恢复到旧系统(或绑定MySQL进程到其中某些核心),因为这种升级反而降低了性能。在MySQL 5.0时代,Google的补丁和Percona Server出现之前,能有效利用的CPU核数是4核,但是现在甚至可以看到操作系统报告多达80个“CPU”的服务器。如果规划一个大的升级,必须要同时考虑硬件、服务器版本和工作负载。
...
2025年1月5日 08:42 周日第8章 优化服务器设置
在这一章,我们将解释为这是我的撒旦JFK数据库嘎斯公开就开始打山豆根士大夫 圣诞节复活节是是国家开始大幅机啊可是对方看见噶开暗杀是的JFK开始讲课的感觉爱看书的JFK史蒂夫卡卡萨丁咖啡碱撒快递费始东方会i二位人家儿童科技数据库的房价开始JFK注释MySQL服务器创建一个靠谱的配置文件的过程。这是一个很绕的过程,有很多有意思的关注点和值得关注的思路。关注这些点很有必要,因为创建一个好配置的最快方法不是从学习配置项开始,也不是从问哪个配置项应该怎么设置或者怎么修改开始,更不是从检查服务器行为和询问哪个配置项可以提升性能开始。最好是从理解MySQL内核和行为开始。然后可以利用这些知识来指导配置MySQL。最后,可以将想要的配置和当前配置进行比较,然后纠正重要并且有价值的不同之处。
人们经常问,“我的服务器有32GB内存,12核CPU,怎样配置最好?”很遗憾,问题没这么简单。服务器的配置应该符合它的工作负载、数据,以及应用需求,并不仅仅看硬件的情况。
MySQL有大量可以修改的参数——但不应该随便去修改。通常只需要把基本的项配置正确(大部分情况下只有很少一些参数是真正重要的),应该将更多的时间花在schema的优化、索引,以及查询设计上。在正确地配置了MySQL的基本配置项之后,再花力气去修改其他配置项的收益通常就比较小了。
从另一方面来说,没用的配置导致潜在风险的可能更大。我们碰到过不止一个“高度调优”过的服务器不停地崩溃,停止服务或者运行缓慢,结果都是因为错误的配置导致的。我们将花一点时间来解释为什么会发生这种情况,并且告诉大家什么是不该做的。
那么什么是该做的呢?确保基本的配置是正确的,例如InnoDB的Buffer Pool和日志文件缓存大小,如果想防止出问题(提醒一下,这样做通常不能提升性能——它们只能避免问题),就设置一个比较安全和稳健的值,剩下的配置就不用管了。如果碰到了问题,可以使用第3章提到的技巧小心地进行诊断。如果问题是由于服务器的某部分导致的,而这恰好可以通过某个配置项解决,那么需要做的就是更改配置。
有时候,在某些特定的场景下,也有可能设置某些特殊的配置项会有显著的性能提升。但无论如何,这些特殊的配置项不应该成为服务器基本配置文件的一部分。只有当发现特定的性能问题才应该设置它们。这就是为什么我们不建议通过寻找有问题的地方修改配置项的原因。如果有些地方确实需要提升,也需要在查询响应时间上有所体现。最好是从查询语句和响应时间入手来开始分析问题,而不是通过配置项。这可以节省大量的时间,避免很多的问题。
另一个节省时间和避免麻烦的好办法是使用默认配置,除非是明确地知道默认值会有问题。很多人都是在默认配置下运行的,这种情况非常普遍。这使得默认配置是经过最多实际测试的。对配置项做一些不必要的修改可能会遇到一些意料之外的bug。
8.1 MySQL配置的工作原理
#
在讨论如何配置MySQL之前,我们先来解释一下MySQL的配置机制。MySQL对配置要求非常宽松,但是下面这些建议可能会为你节省大量的工作和时间。
首先应该知道的是MySQL从哪里获得配置信息:命令行参数和配置文件。在类UNIX系统中,配置文件的位置一般在*/etc/my.cnf或者/etc/mysql/my.cnf*。如果使用操作系统的启动脚本,这通常是唯一指定配置设置的地方。如果手动启动MySQL,例如在测试安装时,也可以在命令行指定设置。实际上,服务器会读取配置文件的内容,删除所有注释和换行,然后和命令行选项一起处理。
关于术语的说明:因为很多MySQL命令行选项跟服务器变量相同,我们有时把选项和变量替换使用。大部分变量和它们对应的命令行选项名称一样,但是有一些例外。例如,–memlock选项设置了locked_in_memory变量。
任何打算长期使用的设置都应该写到全局配置文件,而不是在命令行特别指定。否则,如果偶然在启动时忘了设置就会有风险。把所有的配置文件放在同一个地方以方便检查也是个好办法。
一定要清楚地知道服务器配置文件的位置!我们见过有些人尝试修改配置文件但是不生效,因为他们修改的并不是服务器读取的文件,例如Debian下,/etc/mysql/my.cnf才是MySQL读取的配置文件,而不是*/etc/my.cnf*。有时候好几个地方都有配置文件,也许是因为之前的系统管理员也没搞清楚情况(因此在各个可能的位置都放了一份)。如果不知道当前使用的配置文件路径,可以尝试下面的操作:
** $ which mysqld**
/usr/sbin/mysqld
** $ /usr/sbin/mysqld --verbose --help | grep -A 1 'Default options'**
Default options are read from the following files in the given order:
/etc/mysql/my.cnf ~/.my.cnf /usr/etc/my.cnf
对于服务器上只有一个MySQL实例的典型安装,这个命令很有用。也可以设计更复杂的配置,但是没有标准的方法告诉你怎么来做。MySQL发行版包含了一个现在废弃了的程序,叫mysqlmanager,可以在一个有多个独立部分的配置文件上运行多个实例。(现在已经被一样古老的mysqld_multi脚本替代。)然而许多操作系统发行版本在启动脚本中并不包含或使用这个程序。实际上,很多系统甚至没有使用MySQL提供的启动脚本。
配置文件通常分成多个部分,每个部分的开头是一个用方括号括起来的分段名称。MySQL程序通常读取跟它同名的分段部分,许多客户端程序还会读取client部分,这是一个存放公用设置的地方。服务器通常读取mysqld这一段。一定要确认配置项放在了文件正确的分段中,否则配置是不会生效的。
8.1.1 语法、作用域和动态性
#
配置项设置都使用小写,单词之间用下画线或横线隔开。下面的例子是等价的,并且可能在命令行和配置文件中都看到这两种格式:
/usr/sbin/mysqld --auto-increment-offset=5
/usr/sbin/mysqld --auto-increment-offset=5
我们建议使用一种固定的风格。这样在配置文件中搜索配置项时会容易得多。
配置项可以有多个作用域。有些设置是服务器级的(全局作用域),有些对每个连接是不同的(会话作用域),剩下的一些是对象级的。许多会话级变量跟全局变量相等,可以认为是默认值。如果改变会话级变量,它只影响改动的当前连接,当连接关闭时所有参数变更都会失效。下面有一些例子,你应该清楚这些不同类型的行为:
- query_cache_sizey变量是全局的。
- sort_buffer_sizey变量默认是全局相同的,但是每个线程里也可以设置。
- join_buffer_sizey变量也有全局默认值且每个线程是可以设置的,但是若一个查询中关联多张表,可以为每个关联分配一个关联缓冲(join buffer),所以每个查询可能有多个关联缓冲。
另外,除了在配置文件中设置变量,有很多变量(但不是所有)也可以在服务器运行时修改。MySQL把这些归为动态配置变量。下面的语句展示了动态改变sort_buffer_size的会话值和全局值的不同方式:
...
2025年1月5日 08:42 周日第7章 MySQL高级特性
MySQL从5.0和5.1版本开始引入了很多高级特性,例如分区、触发器等,这对有其他关系型数据库使用背景的用户来说可能并不陌生。这些新特性吸引了很多用户开始使用MySQL。不过,这些特性的性能到底如何,还需要用户真正使用过才能知道。本章我们将为大家介绍,在真实的世界中,这些特性表现如何,而不是只简单地介绍参考手册或者宣传材料上的数据。
7.1 分区表
#
对用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的句柄对象(Handler Object)的封装。对分区表的请求,都会通过句柄对象转化成对存储引擎的接口调用。所以分区对于SQL层来说是一个完全封装底层实现的黑盒子,对应用是透明的,但是从底层的文件系统来看就很容易发现,每一个分区表都有一个使用#分隔命名的表文件。
MySQL实现分区表的方式——对底层表的封装——意味着索引也是按照分区的子表定义的,而没有全局索引。这和Oracle不同,在Oracle中可以更加灵活地定义索引和表是否进行分区。
MySQL在创建表时使用PARTITION BY子句定义每个分区存放的数据。在执行查询的时候,优化器会根据分区定义过滤那些没有我们需要数据的分区,这样查询就无须扫描所有分区——只需要查找包含需要数据的分区就可以了。
分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中。这样做可以将相关的数据存放在一起,另外,如果想一次批量删除整个分区的数据也会变得很方便。
在下面的场景中,分区可以起到非常大的作用:
- 表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据。
- 分区表的数据更容易维护。例如,想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作。
- 分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备。
- 可以使用分区表来避免某些特殊的瓶颈,例如InnoDB的单个索引的互斥访问、ext3文件系统的inode锁竞争等。
- 如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好。
MySQL的分区实现非常复杂,我们不打算介绍实现的全部细节。这里我们将专注在分区性能方面,所以如果想了解更多的关于分区的基础知识,我们建议阅读MySQL官方手册中的“分区”一节,其中介绍了很多分区相关的基础知识。另外,还可以阅读CREATE TABLE、SHOW CREATE TABLE、ALTER TABLE和INFORMATION_SCHEMA.PARTITIONS、EXPLAIN关于分区部分的介绍。分区特性使得CREATE TABLE和ALTER TABLE命令变得更加复杂了。
分区表本身也有一些限制,下面是其中比较重要的几点:
- 一个表最多只能有1024个分区。
- 在MySQL 5.1中,分区表达式必须是整数,或者是返回整数的表达式。在MySQL 5.5中,某些场景中可以直接使用列来进行分区。
- 如果分区字段中有主键或者唯一索引的列,那么所有主键列和唯一索引列都必须包含进来。
- 分区表中无法使用外键约束。
7.1.1 分区表的原理
#
如前所述,分区表由多个相关的底层表实现,这些底层表也是由句柄对象(Handler object)表示,所以我们也可以直接访问各个分区。存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个完全相同的索引。从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。
分区表上的操作按照下面的操作逻辑进行:
SELECT查询
当查询一个分区表的时候,分区层先打开并锁住所有的底层表,优化器先判断是否可以过滤部分分区,然后再调用对应的存储引擎接口访问各个分区的数据。
INSERT操作
当写入一条记录时,分区层先打开并锁住所有的底层表,然后确定哪个分区接收这条记录,再将记录写入对应底层表。
DELETE操作
当删除一条记录时,分区层先打开并锁住所有的底层表,然后确定数据对应的分区,最后对相应底层表进行删除操作。
UPDATE操作
当更新一条记录时,分区层先打开并锁住所有的底层表,MySQL先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,最后对底层表进行写入操作,并对原数据所在的底层表进行删除操作。
有些操作是支持过滤的。例如,当删除一条记录时,MySQL需要先找到这条记录,如果WHERE条件恰好和分区表达式匹配,就可以将所有不包含这条记录的分区都过滤掉。这对UPDATE语句同样有效。如果是INSERT操作,则本身就是只命中一个分区,其他分区都会被过滤掉。MySQL先确定这条记录属于哪个分区,再将记录写入对应的底层分区表,无须对任何其他分区进行操作。
虽然每个操作都会“先打开并锁住所有的底层表”,但这并不是说分区表在处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁,例如InnoDB,则会在分区层释放对应表锁。这个加锁和解锁过程与普通InnoDB上的查询类似。
后面我们会通过一些例子来看看,当访问一个分区表的时候,打开和锁住所有底层表的代价及其带来的后果。
7.1.2 分区表的类型
#
MySQL支持多种分区表。我们看到最多的是根据范围进行分区,每个分区存储落在某个范围的记录,分区表达式可以是列,也可以是包含列的表达式。例如,下表就可以将每一年的销售额存放在不同的分区里:
CREATE TABLE sales (
order_date DATETIME NOT NULL,
-- Other columns omitted
) ENGINE=InnoDB PARTITION BY RANGE(YEAR(order_date)) (
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE );
PARTITION分区子句中可以使用各种函数。但有一个要求,表达式返回的值要是一个确定的整数,且不能是一个常数。这里我们使用函数YEAR(),也可以使用任何其他的函数,如TO_DAYS()。根据时间间隔进行分区,是一种很常见的分区方式,后面我们还会再回过头来看这个例子,看看如何优化这个例子来避免一些问题。
...
2025年1月5日 08:42 周日第6章 查询性能优化
前面的章节我们介绍了如何设计最优的库表结构、如何建立最好的索引,这些对于高性能来说是必不可少的。但这些还不够——还需要合理的设计查询。如果查询写得很糟糕,即使库表结构再合理、索引再合适,也无法实现高性能。
查询优化、索引优化、库表结构优化需要齐头并进,一个不落。在获得编写MySQL查询的经验的同时,也将学习到如何为高效的查询设计表和索引。同样的,也可以学习到在优化库表结构时会影响到哪些类型的查询。这个过程需要时间,所以建议大家在学习后面章节的时候多回头看看这三章的内容。
本章将从查询设计的一些基本原则开始——这也是在发现查询效率不高的时候首先需要考虑的因素。然后会介绍一些更深的查询优化的技巧,并会介绍一些MySQL优化器内部的机制。我们将展示MySQL是如何执行查询的,你也将学会如何去改变一个查询的执行计划。最后,我们要看一下MySQL优化器在哪些方面做得还不够,并探索查询优化的模式,以帮助MySQL更有效地执行查询。
本章的目标是帮助大家更深刻地理解MySQL如何真正地执行查询,并明白高效和低效的原因何在,这样才能充分发挥MySQL的优势,并避开它的弱点。
6.1 为什么查询速度会慢
#
在尝试编写快速的查询之前,需要清楚一点,真正重要是响应时间。如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快(1)。
MySQL在执行查询的时候有哪些子任务,哪些子任务运行的速度很慢?这里很难给出完整的列表,但如果按照第3章介绍的方法对查询进行剖析,就能看到查询所执行的子任务。通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中“执行”可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。
在完成这些任务的时候,查询需要在不同的地方花费时间,包括网络,CPU计算,生成统计信息和执行计划、锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的I/O操作上消耗时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。
在每一个消耗大量时间的查询案例中,我们都能看到一些不必要的额外操作、某些操作被额外地重复了很多次、某些操作执行得太慢等。优化查询的目的就是减少和消除这些操作所花费的时间。
再次申明一点,对于一个查询的全部生命周期,上面列的并不完整。这里我们只是想说明:了解查询的生命周期、清楚查询的时间消耗情况对于优化查询有很大的意义。有了这些概念,我们再一起来看看如何优化查询。
6.2 慢查询基础:优化数据访问
#
查询性能低下最基本的原因是访问的数据太多。某些查询可能不可避免地需要筛选大量数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。对于低效的查询,我们发现通过下面两个步骤来分析总是很有效:
- 确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但有时候也可能是访问了太多的列。
- 确认MySQL服务器层是否在分析大量超过需要的数据行。
6.2.1 是否向数据库请求了不需要的数据
#
有些查询会请求超过实际需要的数据,然后这些多余的数据会被应用程序丢弃。这会给MySQL服务器带来额外的负担,并增加网络开销(2),另外也会消耗应用服务器的CPU和内存资源。
这里有一些典型案例:
查询不需要的记录
一个常见的错误是常常会误以为MySQL会只返回需要的数据,实际上MySQL却是先返回全部结果集再进行计算。我们经常会看到一些了解其他数据库系统的人会设计出这类应用程序。这些开发者习惯使用这样的技术,先使用SELECT语句查询大量的结果,然后获取前面的N行后关闭结果集(例如在新闻网站中取出100条记录,但是只是在页面上显示前面10条)。他们认为MySQL会执行查询,并只返回他们需要的10条数据,然后停止查询。实际情况是MySQL会查询出全部的结果集,客户端的应用程序会接收全部的结果集数据,然后抛弃其中大部分数据。最简单有效的解决方法就是在这样的查询后面加上LIMIT。
多表关联时返回全部列
如果你想查询所有在电影Academy Dinosaur中出现的演员,千万不要按下面的写法编写查询:
mysql> ** SELECT * FROM sakila.actor**
-> ** INNER JOIN sakila.film_actor USING(actor_id)**
-> ** INNER JOIN sakila.film USING(film_id)**
-> ** WHERE sakila.film.title = 'Academy Dinosaur';**
这将返回这三个表的全部数据列。正确的方式应该是像下面这样只取需要的列:
mysql> ** SELECT sakila.actor.* FROM sakila.actor...;**
总是取出全部列
...