技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Apache --> MySQL 并行了吗?

MySQL 并行了吗?

浏览:2704次  出处信息

    前些日子与一位同行讨论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合并返回给读者。

    以上为一家之言

建议继续学习:

  1. Linus:为何对象引用计数必须是原子的    (阅读:11468)
  2. 并行编程中的“锁”难题    (阅读:3764)
  3. li并行显示    (阅读:2881)
  4. 一种并行加载的方法    (阅读:1761)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1