MySQL / MariaDB在多个核上运行单个查询

时间:2015-10-15 08:10:36

标签: mysql mariadb

我有一个相当强大的数据库服务器,有大约24个内核和48 GB的RAM。我们正在运行MariaDB 10.0作为我们的数据库引擎。我的所有表都在InnoDB引擎上运行。我有一些查询在大表上使用相当广泛的连接,因此自然很慢。我正在努力做的一件事是尝试利用多核的力量。以下是我的观察:

  1. 如果我并行运行2个查询,那么我可以看到正在使用2个核心
  2. 如果我运行1个查询,我看到只有1个核心被用于100%
  3. 现在,这是正常行为吗?我的意思是,MariaDB / MySQL中没有办法为单个查询使用多个核心?如果使用多个CPU核心可以更快地运行单个繁重的查询,那将会很棒。

    我尝试搜索多个论坛并使用Innodb_thread_cocurrency等不同参数进行了播放,但到目前为止还无法在多个核心上运行单个查询。

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

    更新:

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

3 个答案:

答案 0 :(得分:9)

虽然这个帖子超过半年,但有些评论引起了一些担忧。作为一个硬核数据库性能调优器,我想在这里添加一点输入:

1)在撰写本文时,MariaDB和MySQL不支持在多个处理器上运行单个查询(除非您正在讨论分片)。这并不意味着他们将来不会支持它。

2)并行化查询可以在其他RDBMS(DB2,Oracle,SQLServer,Postgres等)中完成,它是数据仓库等环境的重要特性。

3)对于长时间运行的查询,通常并行化会缩短执行时间,尽管改进可能不是线性的。因此,说“一个查询使用多个核心使其更快地工作”是不正确的。除非我们对“更快地工作”有不同的定义,否则它对某些工作负载是完全合理的。

4)Bottelnecking CPU并不一定意味着“你正在以错误的方式使用数据库”。是的,有些人确实写了可怕的查询(或驱动查询的程序)并将数据库扼杀,但这完全是另一个问题。

5)并行性将减少并发性。如果您的目标是支持更多用户(即更高的并发性),则必须放弃在多个处理器上运行查询(或者仅在每个查询上运行 less 处理器)。这是你需要做出的权衡。存在过度泛化的风险,您希望OLTP环境查询以串行方式运行,并且OLAP查询可以并行运行。

干杯!

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

某些查询有部分解决方案。 Innodb经过高度优化,可以运行大量{1000的}小{50-几千行}小请求。因此,让我们来做一个简单的任务{将100 M行表复制到另一个表}。简单的方法是INSERT ... SELECT ... FROM ...但是,这样做将运行很长时间,并且如果中断的回滚将花费更长的时间。

现在要解决同样的问题,并编写一个小的过程,一次遍历该表的PK 1000行。这样运行得更快,因为如果中断回滚几乎是即时的,并且您可以在被中断的地方重新启动,则该进程主要包含内存。

现在执行此过程并同时运行两次,在范围的第一个一半运行1个,在下半年运行2个。由于INNODB具有行级锁定,因此其运行速度几乎是单级的两倍。

现在创建一些经常唤醒的事件,并为各自的线程运行该过程。如果我有一个带有INTEL处理器的16核心服务器,那么我可以运行10个并发线程,并以1000%的比例看到CPU居首。我已经在生产中运行了这4年。它只需要<10个表和<10个过程来支持它。作为一项附加好处,其中一个过程将按线程输出%完成。

任何遍历整个数值范围或部分数值范围的sql都可以使用此方法。其中包括分组依据,其中分组中的第一列为数字。因此,不是所有查询的解决方案,而是适用于所有查询的解决方案,我们通常将耗时减少了5倍至10倍。在许多情况下,根本上也没有I / O等待,因此对其他查询的影响最小。