MYSQL-比较1个具有n个分区的表和n个具有相同结构的表



我是一名学生,在研究mysql分区时遇到了一个问题。

示例I有一张表";标签";通过散列(TaskId(具有10个分区

resourceId (PK)
TaskId (PK)
...

我有10张表,名字表是";标签":+taskId:

tables: 
task1(resourceId,...)
task2(resourceId,...)
...

你能告诉我他们之间的优点和缺点吗?感谢

欢迎使用堆栈溢出。我希望你能在你的问题中提供第三种选择:";只有一个没有分区的表"到目前为止,在现实世界中的几乎所有情况下,这都是处理数据的最佳方式。例如,它只需要维护和查询每个索引的一个副本。如果数据的大小接近数十亿行,那么是时候考虑分区之类的东西了。

但别介意。你的问题是将十个表与一个有十个分区的表进行比较。您的十表方法通常被称为分割您的数据。

首先,这两者有什么共同点:它们都由存储设备(ssd或磁盘(上的十个不同的表表示。对一行数据的查询可能在十个中的任何位置,包括使用任何可用的索引或其他技术搜索所有十个数据。这十个表中的每一个都会消耗服务器上的资源:打开文件描述符、RAM缓存等。

以下是一些区别:

  • 当将一行插入到分区表中时,MySQL会计算出要使用哪个分区。使用shard时,应用程序必须确定要使用哪个表,并为该特定表编写INSERT查询
  • 当在分区表中查询几行时,MySQL会自动根据查询的WHERE条件来确定它必须搜索的分区。另一方面,当您搜索您的分片数据时,您的应用程序会很好地确定要搜索哪些表
  • 在您介绍的情况下——通过主键上的哈希进行分区——让MySQL只搜索一个分区的唯一方法是搜索PK的特定值。在您的情况下,这将是WHERE resourceId = foo AND TaskId = bar。如果您根据其他条件(WHERE customerId = something(进行搜索,MySQL必须搜索所有分区。这需要时间。在分片的情况下,应用程序可以使用自己的逻辑来确定要搜索哪些表
  • 如果你的系统变得非常大,你将能够将每个碎片移动到自己的MySQL服务器上,该服务器在自己的硬件上运行。然后,当然,您的应用程序需要为每次访问选择正确的服务器以及正确的碎片表。这对分区不起作用
  • 对于插入的每一行都有一个自动递增id值的分区表,无论它在哪个分区中,每个行都将有自己唯一的id。在分片的情况下,每个表都有自己的自动递增id序列。不同表中的行将具有重复的ID
  • 用于分区的数据定义语言(DDL:CREATE TABLE等(比用于分片的稍微简单一些。编写DDL将列或索引添加到分区表比将其添加到一堆碎片表更容易,重复性更低。由于数据量足以证明分片或分区的合理性,需要添加和修改索引,以满足未来应用程序的需求

这些是一些实际的差异专业提示不要对数据进行分区和分片,除非你有非常好的理由这样做。

请记住,服务器硬件、磁盘硬件和MySQL软件正在积极开发中。如果你的数据需要几年的时间才能增长得很大,那么新的硬件和新的软件版本可能会得到足够快的改进,同时你不必太担心分区/分片。

最新更新