13

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

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

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

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

4

3 回答 3

9

值得一提的是,我已经处理了一些更大的系统,并且有一个自定义的内部应用程序可以聚合来自服务器的查询,以供公司的一般应用程序使用。

例如select * from t1被转换为:

select * from db1.t1
union
select * from db2.t2

等等

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

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

您最终可能会遇到一些奇怪的查询,例如(请原谅语法):

  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)

这使得每日统计数据非常简单,因为您只需将总列相加,将单个服务器值乘以服务器总数然后除以总数等的平均值,并在高水平。

我们最终做了很多索引和优化,保留常用信息的小型本地表等技巧有助于加快查询速度。

对于较大的查询,数据库人员只是将完整的系统副本转储到备份系统上,我们会在白天使用它在本地处理它,以免对网络造成太大影响。

有一些技巧可以减少这种情况,例如共享小表(例如,用户的主表等非更改数据等),这样您就不必浪费时间收集这些表了。

在实践中真正有用的另一件事是将简单查询的总和和总计汇总到每晚的表中。

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

有一些 SQL 可以自动缩放,我最近阅读了一些关于工具(但不是 php)的文章,它们将为您完成其中的一些工作。我认为它们与云虚拟机提供商有关。

该线程还提供了一些工具和想法:MySQL 分片方法?

如果 NoSQL 是一个选项,您可能会考虑在走这条路之前查看所有的数据库系统。

不过,NoSQL 方法可能更容易扩展,具体取决于您正在寻找的内容。

于 2012-11-15T10:25:03.077 回答
4

使用分片查询

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

于 2011-06-04T17:05:36.257 回答
0

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

假设你有一张employee表,根据employee_id对这张表进行分片,分片数为10。现在分片表中的数据可以放在表名中,比如employee_(employee_id % 10)。因此,员工数据将根据分片键进入名称为employee_1,employees_2 .....employees_10 的表中。

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

于 2018-02-06T03:55:43.150 回答