MySQL 分片方法?

2023-12-03

对 MySQL 表进行分片的最佳方法是什么? 我能想到的方法是:

  1. 应用程序级别分片?
  2. MySQL代理层的分片?
  3. 用于分片的中央查找服务器?

您知道该领域有哪些有趣的项目或工具吗?


对 MySQL 表进行分片的最佳方法是不要这样做,除非完全不可避免。

当您编写应用程序时,您通常希望以最大化速度、开发人员速度的方式进行。仅在必要时才优化延迟(直到答案准备就绪的时间)或吞吐量(每个时间单位的答案数量)。

仅当所有这些分区的总和不再适合单个数据库服务器实例时(原因是写入或读取),您才进行分区,然后将分区分配给不同的主机(= 分片)。

写入情况是 a) 写入频率使该服务器磁盘永久超载,或者 b) 正在进行太多写入,导致复制在此复制层次结构中永久滞后。

分片的读取情况是当数据的大小太大以至于其工作集不再适合内存时,并且数据读取开始命中磁盘而不是大多数时候从内存提供服务。

只有当你have分片你就这样做。


当你进行分片时,你会以多种方式为此付出代价:

您的大部分 SQL 不再是声明性的。

通常,在 SQL 中,您告诉数据库您想要什么数据,然后将其留给优化器将该规范转换为数据访问程序。这是一件好事,因为它很灵活,而且编写这些数据访问程序是一项无聊的工作,会损害速度。

在分片环境中,您可能会将节点 A 上的表与节点 B 上的数据连接起来,或者您在节点 A 和 B 上有一个比节点大的表,并将其中的数据与节点 B 和 C 上的数据连接起来。您开始手动编写应用程序端基于哈希的连接解析来解决这个问题(或者您正在重新发明 MySQL 集群),这意味着您最终会得到大量不再是声明性的 SQL,而是以过程方式表达 SQL 功能(例如,您在循环中使用 SELECT 语句)。

您遭受了大量的网络延迟。

通常,SQL 查询可以在本地解析,优化器了解与本地磁盘访问相关的成本,并以最小化成本的方式解析查询。

在分片环境中,查询可以通过跨网络运行到多个节点的键值访问(希望使用批量键访问而不是每次往返的单独键查找)或通过推送部分数据来解决。WHERE子句前进到可以应用它们的节点(称为“条件下推”),或两者。

但即使在最好的情况下,这也涉及比本地情况更多的网络往返,而且更加复杂。特别是因为 MySQL 优化器对网络延迟一无所知(好吧,MySQL 集群在这方面正在慢慢变得更好,但对于集群外的普通 MySQL 来说仍然如此)。

您正在失去 SQL 的大量表达能力。

好吧,这可能不太重要,但是外键约束和其他用于数据完整性的 SQL 机制无法跨越多个分片。

MySQL 没有允许正常工作的异步查询的 API。

当同一类型的数据驻留在多个节点上时(例如节点A、B、C上的用户数据),往往需要针对所有这些节点进行水平查询(“查找所有90天内未登录的用户帐户”)或者更多”)。数据访问时间随着节点数量线性增长,除非可以并行询问多个节点并在结果到达时对其进行聚合(“Map-Reduce”)。

其先决条件是异步通信 API,而对于处于良好工作状态的 MySQL 来说,异步通信 API 并不存在。另一种选择是在子进程中进行大量分叉和连接,这就是在季票上访问糟糕的世界。


一旦开始分片,数据结构和网络拓扑就会随着应用程序的性能点而变得可见。为了表现得相当好,您的应用程序需要了解这些事情,这意味着实际上只有应用程序级别分片才有意义。

如果您想要自动分片(例如通过散列主键确定哪一行进入哪个节点)或者如果您想以手动方式进行功能分割(“与 xyz 用户故事相关的表转到此master,而 abc 和 def 相关表则转到该 master”)。

功能分片的优点是,如果做得正确,大多数开发人员在大多数情况下都看不到它,因为与其用户故事相关的所有表都可以在本地使用。这使得他们仍然可以尽可能长时间地从声明式 SQL 中受益,并且由于跨网络传输的数量保持在最低限度,因此也会减少网络延迟。

功能分片的缺点是它不允许任何单个表大于一个实例,并且需要设计者的手动关注。

功能分片的优点是可以相对轻松地对现有代码库进行一些不太大的更改。http://Booking.com在过去的几年里,他们已经这样做过很多次了,而且效果很好。


话虽如此,看看你的问题,我确实相信你问了错误的问题,或者我完全误解了你的问题陈述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 分片方法? 的相关文章

  • MySQL 按主键排序

    某些 SQL 服务器允许使用通用语句 例如ORDER BY PRIMARY KEY 我不相信这适用于 MySQL 是否有任何此类解决方法可以允许跨多个表自动选择 或者是否需要查找查询来确定主键 我一直在研究的解决方法包括调用SHOW COL
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • 在docker中使用MySQL数据库设置aspnetcore

    我正在尝试设置一个 docker compose 文件 其中包含 asp net core mysql 数据库和 phpmyadmin 的容器 设置我的 mysql 服务器没有问题 我可以使用 phpmyadmin 访问它 我的 asp n
  • 将 UPDATE 转换为 INSERT INTO ON DUPLICATE KEY UPDATE 语句

    我有这个 UPDATE MySQL 语句 效果很好 UPDATE table1 Inner Join table2 ON table2 id table1 gw id SET table1 field1 1 table1 field2 2
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • 当sql连接中存在两个同名列时,如何从一个表列中获取值

    当我连接两个具有相同名称列的表时 我目前面临着尝试获取值的问题 例如 table1 date和table2 date 每个表中的日期不同 我将如何获取 日期 本例中的表1 我目前正在跑步 while row mysqliquery gt f
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 vitess 仅对特定表进行分片

    我创建了一个包含三个表的未分片键空间 现在我想对前两个表的键空间进行分片 但不想对第三个表进行分片 如何才能做到这一点 Vitess 文档不包含任何与此相关的信息或示例 请帮忙 Thanks vitess 中的垂直分片与水平分片类似 您应该
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb

随机推荐

  • 无法在 Google Slides API 上使用 PageSize 创建演示文稿

    我正在尝试创建新的 4 3 演示文稿 而不是 16 9 我阅读了此参考文献并编写了一些 ruby 代码 但它不起作用 新演示文稿的高度与我指定的高度不同 方法 presentations create 幻灯片 API谷歌开发者 foo rb
  • Java5 -XX:MaxHeapFreeRatio=45 即使超过 45% 的堆空闲也不会释放堆

    我有一个带有以下参数的 java 应用程序 但即使总可用空间大于 45 可以通过可视化 VM 查看 堆也不会被回收 JVM 是否有任何原因不释放该堆空间 相同的设置在 Java6 中按预期工作 运行Java5运行时和编译时 java jar
  • 如何使用sql从日期字段按月分组

    如何仅按日期字段中的月份进行分组 而不是按天分组 这是我的日期字段的样子 2012 05 01 这是我当前的 SQL select Closing Date Category COUNT Status TotalCount from MyT
  • Alfresco Workflow 表单中的多个受让人控件

    我需要构建一个工作流程 允许管理员在工作流程的第一个任务中从两个不同的组中选择两个受让人 我可以在一种表单中使用两个受让人控件吗 如何 你需要 在任务内容模型中 将 2 个受让人定义为任务类型的 2 个独立关联
  • Twitter 的 Bootstrap 3 在同一页面上有多个导航栏

    同一页面下拉菜单上的多个导航栏将与其他导航栏重叠 请参阅 如何防止这种情况发生 尽管导航栏仅供单一使用 但您可以自由地将更多导航栏用作每页一个导航栏 同一页面上的多个导航栏将具有相同的 z index 1000 因此下拉菜单可能会重叠 当使
  • Python 字符串 - 字符串的不变性

    我想知道如果 Python 字符串是不可变的 那么这段代码为何有效以及它是如何工作的 a input for i in a if i isupper print i lower end else print i upper end 这会更改
  • 获取用户图片

    操作系统 Win7x64 2008 2008r2 郎 德尔福Xe2 如何接收图像 用户帐户图片 的完整路径 和文件名 如何设置新图片 delphi 上的例子请 需要 函数 GetCurrentUser 图片 字符串 函数 GetUserPi
  • 如何为 flex 和 bison 编写工作 cmake 文件?

    我正在编写一个小型解析器 但在使用 cmake 时遇到问题 我的目的是 flex F l gt F cc bison B y gt B cc my program cc F cc B cc gt 库 我的第一次尝试 FIND PACKAGE
  • 使用“ld”链接时出现“未定义的符号引用”错误

    我是在 Linux 上编写程序的新手 我有一个使用的单模块程序shm open ftruncate mmap fork and wait 我编译了这个程序gcc c然后将其链接到ld lrt 需要 librtshm open 并且我遇到了一
  • SQLAlchemy 会话对象中的“设置会话”

    我正在将 SQLAlchemy 用于一个项目 出于性能原因 需要能够为一个特定调用指定会话变量 设置 set session max heap table size 1024 1024 64 我当然可以直接在 MySQL 中 在 shell
  • Android ViewPager2 FragmentStateAdapter 显示每个 Fragment 中的菜单

    我有一个带有底部导航视图的活动 其中有 3 个关联的片段 其中之一是带有使用 FragmentStateAdapter 的 ViewPager2 的 Fragment 在适配器的 createfragment intposition 方法中
  • Spark 在 Standalone 中比 YARN 中工作得更快

    希望了解有关独立和纱线上 Spark 执行的一些见解 我们有一个 4 节点的 cloudera 集群 目前我们的应用程序在 YARN 模式下运行时的性能不到在独立模式下执行时的一半 有人对可能造成这种情况的因素有一些了解吗 基本上 您的数据
  • 如何在运行时更改xamarin表单中的MainPage?

    在 xamarin 表单中 RootPage 具有主详细信息布局 我的任务是在用户成功登录后显示该页面 我正在使用 azure 移动服务进行登录 我花了更多的时间来获得结果 我看到了一些其他解决方案 但这些解决方案没有按预期呈现主要细节 最
  • 将 unsigned int 缩小转换为短 unsigned int

    警告 在 C 11 中 将 内的 stride 4u 从 unsigned int 到 WORD aka Short unsigned int 缩小转换是不正确的 Wnarrowing 我不明白为什么在从 MinGW 编译以下代码时会收到此
  • 通过delphi检索扩展文件属性

    当您在 Windows 资源管理器中右键单击某个文件并从菜单中选择 属性 时 将出现一个对话框 显示该文件的基本属性 我正在尝试获取文件夹中Word 文件的这些属性 关键字 注释 标题 我修改了在某处找到的代码 它在 vba MSWord
  • 如何根据用户操作系统更改CSS

    我如何编写 CSS 来处理 Mac 操作系统上的不同效果以及其他操作系统版本上的不同效果 i e mac height 100 width 100 overflow hidden win and linux height 100 width
  • 如何对应用程序的每个 p:selectOneMenu 中的 f:selectItems 进行排序?

    Eg
  • 使用Python删除Excel中的重复/重复出现

    我正在尝试删除 名称 列下的重复 重复名称 我只是想通过使用 python 脚本来保留重复 重复名称的第一次出现 这是我的输入excel 并且需要这样的输出 这并不是删除重复项 也就是说您只是将一列中的重复键填充为空白 我将按如下方式处理
  • 使用 CSS 进行背景模糊

    我想要一个Vista 7 航空玻璃风格效果在我网站上的弹出窗口上 它需要是动态的 只要网站仍然存在 我就可以接受这不是跨浏览器效果works在所有现代浏览器上 我的第一次尝试是使用类似的东西 dialog base background w
  • MySQL 分片方法?

    对 MySQL 表进行分片的最佳方法是什么 我能想到的方法是 应用程序级别分片 MySQL代理层的分片 用于分片的中央查找服务器 您知道该领域有哪些有趣的项目或工具吗 对 MySQL 表进行分片的最佳方法是不要这样做 除非完全不可避免 当您