MySQL 并行了吗?
前些日子与一位同行讨论mysql的并行运行能力。为给那些只为获得答案的看众节省时间。提前下个结论,mysql目前暂不具备并行运行某一查询的能力。相信很多人有一个误解,似乎MySQL 5.4对某一查询带来的性能改进是非常巨大的。事实上,这需要针对具体应用来讲,如果追求某个具体查询的响应时间,5.4 将比5.1或之前的版本差。简单的来说,5.4提高的是并发量,而不是减少单条语句的执行时间。
初次看到这个话题的人要注意几个概念,并行和多线程不是同一个概念。“同时进行”的技术分很多类,有查询间的并行,查询内的并行和操作内的并行。举个生活中的例子,
如果你与其他人合租房子的话,早上起来后,多个人可以同时刷牙,洗脸和做饭,大家各忙各的(虽然女房客可能会给厕所加上mutex而其他人只能在原地spin)。单单这套房子来说,它在较短的时间内解决了好几个人的早上洗漱问题。这就是查询间并发了。早上诸多行动中,以刷牙、做法、吃饭这三个动作为例,我们通常的做法是把微波炉转上,然后刷牙,刷牙结束后,早饭也弄好了(至少我是这么做的),这样我们达到了查询内的并行。再细化下去,现在加一个动作:整理电脑包,按照上一种方式我们可以按这样的顺序做事情:做饭
刷牙 -》 吃饭 -》 整理电脑包
如果你有两只手的话,我们可以用一只手刷牙,另外一只手整理电脑包,这样进一步缩短你的运行时间,这样你就做到了操作内的并行。
总结起来:第一种情况整体吞吐量很大。第二种情况,个人的处理时间减少了。 第三种情况,个人的处理时间进一步减少。
有兴趣的人可以在database system concepts这本书中了解相关概念。查询间的并行对于数据库管理软件来说是再正常不过的功能,所以下面我们将直接跳过这类“同时进行”。从理论上讲,数据库的多个模块:IO、SQL解析和SQL执行等都可以达到并行执行的目的。
通过将关系划分到多个磁盘来减少从磁盘检索关系所需的时间,从而使得数据库IO可以并行执行。另外在一个查询中的多个联接操作和排序操作也可并行发生。对等值联接和自然联接, 可以将两个输入关系划分到多个处理器上, 各处理器在本地计算联接.
当然以上讨论的一切一切都基于CPU是多核的。
但是目前我个人不支持mysql并行化,这也符合很大一部分mysql开发人员的意见。理由:
并行化,将导致MySQL工程越来越复杂,随之而来的是Bug数量快速增加。(从上面例子中,我们也可看出操作内的并行比较挑战你的操作能力。例如你需要能够不看镜子刷牙、偶尔还要去看看饭做的怎么样了、单手拿laptop等等,中间不小心摔东西的概率就增加了)就mysql目前的应用来看,使用者更在意mysql数据库的吞吐量,而不是效应速度(当然了,响应速度也是很重要的)。mysql目前的简单架构replication可大幅提高数据库端的吞吐量。目前现存的其他开源技术亦能满足并行查询的需求如hadoop、map reduce。支持并行运行的MySQL意味着什么?查询优化器和JOIN::Execution的代码将被大量修改,mysql项目将有可能会被长时间拖延处于beta状态。(Perl6 雄心勃勃对Perl 5进行巨大改进,然而8年过去了,还未见其像样的RC版。)
最后,我们还可以利用mysql proxy来达到并行的目的。查询在mysql proxy中被划分成多个部分,各个部分可在不同的mysql服务器上查询获得数据,再由mysql proxy合并返回给读者。
以上为一家之言
建议继续学习:
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:hironics 来源: SQL部落
- 标签: 并行
- 发布时间:2009-11-29 21:57:05
- [46] 界面设计速成
- [42] Oracle MTS模式下 进程地址与会话信
- [41] 视觉调整-设计师 vs. 逻辑
- [40] IOS安全–浅谈关于IOS加固的几种方法
- [39] android 开发入门
- [39] 图书馆的世界纪录
- [38] 【社会化设计】自我(self)部分――欢迎区
- [38] 如何拿下简短的域名
- [37] 程序员技术练级攻略
- [34] 读书笔记-壹百度:百度十年千倍的29条法则