草庐IT

mysql - 在庞大的 MySQL 数据库上运行分析

coder 2023-10-05 原文

我有一个 MySQL 数据库,其中包含一些(准确地说是五个)巨大的表。它本质上是一个基于星型拓扑结构的数据仓库。表大小范围从 700GB(事实表)到 1GB,整个数据库高达 1 TB。现在我被赋予了对这些表运行分析的任务,其中甚至可能包括连接。 对该数据库的一个简单分析查询可以是“找到每个州的吸烟者数量并按降序显示”这个需求可以转换为一个简单的查询,如

select state, count(smokingStatus) as smokers 
from abc 
having smokingstatus='current smoker' 
group by state....

此查询(以及许多其他相同性质的查询)在此数据库上执行需要花费大量时间,所用时间约为数十小时。

该数据库还大量用于插入,这意味着每隔几分钟就会添加数千行。

在这种情况下,我该如何解决这个查询问题? 我看过 Cassandra,它似乎很容易实现,但我不确定它是否会像在数据库上运行分析查询一样容易,尤其是当我必须使用“where 子句和按构造分组”时

还查看了 Hadoop,但我不确定如何实现 RDBMS 类型的查询。我不太确定我是否想立即投资购买至少三台机器用于名称节点、动物园管理员和数据节点!!最重要的是,我们公司更喜欢基于 Windows 的解决方案。

我还考虑过在更简单的汇总表中预先计算所有数据,但这限制了我运行不同类型查询的能力。

还有什么我可以实现的其他想法吗?

编辑

以下是mysql环境搭建

1) 主从设置 2)插入/更新的主人 3) 用于读取和运行存储过程的slave 4)所有表都是innodb,每个表都有文件 5) 字符串和 int 列的索引。

预计算值是一种选择,但由于对这种临时聚合值的要求不断变化。

最佳答案

从试图让 MySQL 更好地工作而不是提出一个全新的架构系统的角度来看:

首先,验证到底发生了什么。解释导致问题的查询,而不是猜测发生了什么。

话虽如此,由于我没有查询计划,所以我将猜测发生了什么。我猜 (a) 你的索引没有被正确使用,你得到了一堆可以避免的表扫描,(b) 你的数据库服务器针对 OLTP 而不是分析查询进行了调整,(c) 在读取时写入数据导致事情大大减慢,(d) 使用字符串很糟糕,(e) 你有一些低效的查询和可怕的连接(每个人都有一些)。

为了改进,我会调查以下内容(大致按此顺序):

  • 检查查询计划,确保正确使用现有索引 - 查看表扫描,确保查询确实有意义。

  • 将分析查询从 OLTP 系统中移出 - 快速插入和短查询所需的调优与可能读取大表的大部分查询的调优大不相同。这可能意味着拥有另一个具有不同配置(以及可能的表类型 - 我不确定 MySQL 目前的最新技术水平)的仅分析从站。

  • 将字符串移出事实表 - 而不是让吸烟状态列的字符串值为(比如)'current smoker'、'recently quit'、'quit 1+ years'、'never smoked' ,将这些值推送到另一个表,并在事实表中包含整数键(这也有助于索引的大小)。

  • 在查询运行时停止更新表 - 如果索引在查询运行时移动,我看不到好事发生。 (幸运的是)我已经有很长时间不关心 MySQL 复制了,所以我不记得你是否可以在没有太多戏剧性的情况下批量写入分析查询从属。

  • 如果您在没有解决性能问题的情况下走到这一步,那么是时候考虑离开 MySQL 了。我会先看看 Infobright——它是开源的/$$ & 基于 MySQL,所以它可能是最容易放入现有系统的(确保数据进入 InfoBright DB,然后将你的分析查询指向 Infobright服务器,保持系统的其余部分不变,工作完成),或者如果 Vertica 曾经发布其社区版。 Hadoop+Hive 有很多事件部件 - 它非常酷(并且在简历上很棒),但如果它只用于系统的分析部分,它可能比其他选项需要更多的关注和支持。

关于mysql - 在庞大的 MySQL 数据库上运行分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777284/

有关mysql - 在庞大的 MySQL 数据库上运行分析的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  4. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  5. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. ruby-on-rails - 无法让 rspec、spork 和调试器正常运行 - 2

    GivenIamadumbprogrammerandIamusingrspecandIamusingsporkandIwanttodebug...mmm...let'ssaaay,aspecforPhone.那么,我应该把“require'ruby-debug'”行放在哪里,以便在phone_spec.rb的特定点停止处理?(我所要求的只是一个大而粗的箭头,即使是一个有挑战性的程序员也能看到:-3)我已经尝试了很多位置,除非我没有正确测试它们,否则会发生一些奇怪的事情:在spec_helper.rb中的以下位置:require'rubygems'require'spork'

  9. ruby-on-rails - before_filter 运行多个方法 - 2

    是否有可能:before_filter:authenticate_user!||:authenticate_admin! 最佳答案 before_filter:do_authenticationdefdo_authenticationauthenticate_user!||authenticate_admin!end 关于ruby-on-rails-before_filter运行多个方法,我们在StackOverflow上找到一个类似的问题: https://

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐