我正在处理MySQL数据库中的大量数据,我想使用分片来扩展。我理解分片的原理,我甚至知道如何分割我的数据。
当我查找数据库分片时,我找不到任何关于如何实际管理和查询分片数据库的综合示例。
具体来说,假设我已将数据拆分为多个表/数据库(分片),查询该数据的最佳方法是什么?我认为没有办法让mysql智能地知道要使用哪个分片。
是否有可以管理分片和查询的第三方软件?或者我是否必须更改我的代码(用PHP编写)以与分片数据接口?
答案 0 :(得分:6)
为了它的价值,我已经处理了一些更大的系统,并且有一个自定义的内部应用程序聚合来自服务器的查询,用于公司的通用aps。
e.g。 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)
。
这使得每日统计数据非常微不足道,因为您只计算总列数,将单个服务器值乘以服务器总数然后除以总计等的平均值,并且具有非常快的仪表板在高层看。
我们最终做了大量的索引和优化,并且保留常用信息的小型本地表等技巧有助于加速查询。
对于较大的查询,db人员只是在备份系统上转储了一个完整的系统副本,我们会在白天使用它来在本地处理它,以免过于频繁地攻击网络。
有一些技巧可以减少这种情况,例如共享小表(例如用户的主表等,不变数据等),这样你就不必浪费时间去收集它们。
在实践中真正有用的另一件事是汇总总和和总数,以便简单地查询夜间表格。
最后一件感兴趣的事情是,bw问题的解决方法是在内部'查询聚合器'中设置一个“退避”超时,它所做的是从记录提取的响应时间,如果时间开始被推迟,它会要求更少的记录并增加它所要求的查询的延迟(因为它是报告而不是时间敏感,这工作正常)
有一些SQL是autoscales,我最近阅读了一些关于工具(但不是php)的文章,它们会为你做一些。我认为他们与云虚拟机提供商有关。
此主题还提供了一些工具和想法:MySQL sharding approaches?
如果NoSQL是一个选项,你可以考虑在去那条路线之前查看那里的所有数据库系统。
NoSQL方法可能更容易扩展,具体取决于您所寻找的内容。
答案 1 :(得分:4)
使用Shard-Query。
请参阅:http://www.mysqlperformanceblog.com/2011/05/14/distributed-set-processing-with-shard-query/
答案 2 :(得分:0)
您可以在mysql中使用分区或分片。如果使用分区,则mysql将根据where子句中的条件为您提取正确的数据。如果使用分片,则需要定义分片键。因此,数据将根据分片键在表格中分片。
假设您有一个employee表,并根据employee_id对该表进行分片,并且shard count为10.现在,分片表中的数据可以像employees_(employee_id%10)一样放在表名中。因此,员工数据将根据分片键进入名为employee_1,employees_2 ..... employees_10的表中。
这里mysql不会自动计算表名,但你必须使用你正在使用的语言。