2015-10-15 105 views
4

我有一个体积很大的数据库服务器,具有大约24个内核和48 GB的RAM。我们运行MariaDB 10.0作为我们的数据库引擎。我所有的表都在InnoDB引擎上运行。我有几个查询在大表上使用相当广泛的联接,因此速度很慢。我正在努力做的一件事就是尝试并利用多核心的力量。这是我的观察:MySQL/MariaDB在多个内核上运行单个查询

  1. 如果我并行运行2个查询,然后我可以看到2个核被利用
  2. 如果我运行1个查询,我看到的只是被利用在100%1芯

现在,这是正常的行为?我的意思是MariaDB/MySQL没有办法为单个查询使用多个核心?如果单个大型查询可以通过使用多个CPU核心运行得更快,那将会非常棒。

我确实尝试过搜索多个论坛,并且使用了不同的参数(如Innodb_thread_cocurrency),但迄今为止还无法在多个核心上运行单个查询。

是否有任何其他引擎可以帮助我做到这一点(我目前正在阅读关于XtraDB)?

更新:

那么,其实我试图分析社交媒体数据。所以想象一个有2-3百万推文的数据库。当然,我们正在与用户数据,主题标签,图像,链接等相关联的表格。因此总的来说,这是一个相当大的数据库。在某些情况下,有些查询需要在多个表上进行连接,并且速度很慢。因此,想象一下,例如具有5-6个不同查询的仪表板查询。当单个用户登录时,这会将负载放在单个内核上,整个内核将在n秒内使用。如果我有12个核心,并假设12个用户同时尝试访问系统,那么我有一个严重的瓶颈。我完全理解,像分片,集群,分布式数据库,分区等选项可以帮助我。但现在我正试图理解如何在垂直缩放(其中我引入更多服务器)之前垂直缩放系统。多核心的使用将是一个很好的选择,但我想现在我明白了,MySQL本身并不是这样设计的。我想我会开始研究各种[可能的体系结构来扩展多个实例的数据库。

+0

应该Serverfault或DBA stackexchange平台要求。已经有[重复](http://serverfault.com/questions/566330/mysql-multi-threading-for-a-single-query)。 – DanFromGermany

+2

不,它没有任何意义,一个查询使用多个核心使其工作更快。这不是CPU的瓶颈 - 如果是这样,那么编写这样的SQL查询的人就应该得到某种程度的奖励。如果您是开发人员,您将如何并行查询执行?查询非常简单,它们变得易懂,然后MySQL知道你想要做什么,它开始寻找数据 - 这些步骤都不会受益于多核。当同时涉及2个查询时,一个核心一次处理一个查询。 – Mjh

+0

您可以使用整体单一查询处理大块数据。像MapReduce在NoSQL中工作一样。 – DanFromGermany

回答

3

As Mjh explained,如果CPU是瓶颈,那么你必须以错误的方式使用你的数据库。

InnoDB不支持单个查询的并行化。您可能可以通过spreading your tablespaces across several physical drives实现某种并行化(但我甚至不确定性能是否是此功能的主要目标,如果这能够改善任何情况,那么它在IO是瓶颈时就会发生)。

+0

对于严重的对位问题,请使用[使用群集](https://www.mysql.fr/products/cluster/features.html)。 – RandomSeed

+0

或碎片(在MySQL中称为“分区”)。 – DanFromGermany

+1

“Sharding”将数据分离到多个服务器上 - 使用MariaDB的Spider引擎进行处理(并获得并行性)。 “分区”将数据分割成单个服务器上的多个“表” - 无并行性。 –

7

虽然这个线程已经超过半年的时间,但一些评论引起了一些关注。作为核心数据库性能调谐器,我想在这里添加一些输入:

1)在撰写本文时,MariaDB和MySQL不支持在多个处理器上运行单个查询(除非您正在讨论关于分片课程)。这并不意味着他们将来不会支持它。 2)并行化查询可以在其他RDBMS(DB2,Oracle,SQLServer,Postgres等)中完成,并且它是诸如数据仓库等环境的一个重要特性。

3)对于长时间运行的查询,往往不是,并行将缩短执行时间,但改善可能不是线性的。因此,说'一个查询使用多个核心使其工作更快'是不合理的。除非我们对“加快工作”有不同的定义,否则对于某些工作量来说,这是非常有意义的。

4)Bottelnecking CPU并不一定意味着“你正在使用的数据库走错了路”。是的,有些人的确写了可怕的查询(或者推动查询的过程)并将数据库扼杀至死,这确实是一个完全不同的问题。

5)并行将减少并发性。如果你的目标是支持更多的用户(即更高的并发性),你将不得不放弃在多个处理器上运行的查询(或只是每次查询处理器上运行)。这是一个你需要做的交易。冒着过度泛化的风险,您希望OLTP环境查询能够以串行方式运行,而OLAP查询能够并行运行。

干杯!