首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MySQL中查询分片数据

在MySQL中查询分片数据
EN

Stack Overflow用户
提问于 2011-06-05 00:54:29
回答 3查看 9.6K关注 0票数 13

我正在处理MySQL数据库中的大量数据,我想使用分片来向外扩展。我理解分片的原理,我甚至知道我想如何分片我的数据。

当我查找数据库分片时,我找不到任何关于如何实际管理和查询分片数据库的全面示例。

具体地说,假设我将数据拆分为多个表/数据库(分片),那么查询该数据的最佳方式是什么?我不认为有一种方法可以让mysql智能地知道使用哪个分片。

是否有第三方软件可以管理分片和我的查询?或者我必须更改我的代码(用php编写)才能与分片后的数据交互?

EN

回答 3

Stack Overflow用户

发布于 2012-11-15 18:25:03

为了它的价值,我已经处理过一些较大的系统,有一个自定义的内部应用程序,它聚合来自服务器的查询,用于公司的通用aps。

例如,select * from t1被转换为:

代码语言:javascript
运行
复制
select * from db1.t1
union
select * from db2.t2

等。

主要的问题是,如果您遇到的是跨服务器连接,在大型百万行以上的系统上,它可能会对网络造成很大的影响,并且需要很长时间来处理查询。

例如,假设您正在进行网络分析,并且需要对表进行连接以确定用户属性的“链接”。

你可能会得到一些奇怪的查询,就像这样(请原谅语法):

代码语言:javascript
运行
复制
  select db1.user1.boss, db1.user1.name, db2.user.name db2.user.boss from db1 inner join on db1.user.name = db2.user.name

(例如,得到一个人的老板,他们的老板,或者朋友的朋友等等)

当你想要获得好的数据来执行链式查询时,这可能是一个巨大的PITA,但是,对于简单的统计数据,如总数,平均值等。对于这些人来说,最有效的是夜间查询,将统计数据聚合到每个服务器上的一个表中(例如,nightlystats)。例如select countif(user.datecreated>yesterday,1,0) as dailyregistered, sumif(user.quitdate)... into (the new nightly record)

这使得每天的统计数据变得非常微不足道,因为您只需对总数列求和,将单个服务器值乘以服务器总数,然后再除以总数,等等,并在较高级别拥有一个相当快速的仪表板视图。

我们最终做了很多索引和优化,像保存常用信息的小本地表这样的技巧有助于加速查询。

对于更大的查询,db的家伙只是在备份系统上转储了一个完整的系统副本,我们会在白天使用它在本地处理它,以免对网络造成太大的影响。

有一些技巧可以减少这一点,比如共享小表(例如,用户的主表等不变的数据等)。这样你就不需要浪费时间去收集这些东西了。

在实践中真正有用的另一件事是将简单查询的sums和totals聚合到每夜的表中。

最后一件有趣的事情是,bw问题的解决方法是在内部“查询聚合器”中设置一个“后退”超时,它所做的是记录获取响应的时间,如果时间开始延迟,它将要求更少的记录,并为它请求的查询增加延迟(因为它是报告的,并且对时间不敏感,所以工作正常)。

有一些SQL可以自动伸缩,我最近读了一些关于工具(但不是php)的文章,它们可以为你做一些事情。我认为它们与云vm提供商有关。

这个线程还提供了一些工具和想法:MySQL sharding approaches?

如果可以选择NoSQL,您可以考虑在执行该操作之前查看所有的数据库系统。

但是,根据您正在寻找的内容,NoSQL方法可能更容易扩展。

票数 9
EN

Stack Overflow用户

发布于 2011-06-05 01:05:36

使用Shard-Query

请参阅:http://www.mysqlperformanceblog.com/2011/05/14/distributed-set-processing-with-shard-query/

票数 4
EN

Stack Overflow用户

发布于 2018-02-06 11:55:43

您可以在mysql中使用分区或分片。如果您使用分区,那么mysql将根据where子句中的条件为您获取正确的数据。如果你正在使用分片,那么你需要定义一个分片键。因此,数据将根据分片键在表中进行分片。

假设您有一个employee表,并根据employee_id对该表进行了分片,分片计数为10。现在,分片表中的数据可以放入表名中,如employees_(employee_id % 10)。因此,员工数据将根据分片键放入名为employee_1,employees_2 .....employees_10的表中。

在这里,mysql不会自动计算表名,但你必须用你正在使用的语言来计算。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6238086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档