mysql - 如何索引表中单调递增的数据?

标签 mysql google-cloud-platform scalability google-cloud-spanner

我有一个表,其中包含一个单调递增的字段,我想将其放入索引中。然而,最佳实践guide表示不要将单调递增的数据放入非交错索引中。当我尝试将数据放入交错索引时,我无法在其父表中交错索引。

换句话说,我想要这个 MySQL 模式的 Cloud Spanner 等价物。

CREATE TABLE `my_table` (
  'id' bigint(20) unsigned NOT NULL,
  'monotonically_increasing' int(10) unsigned DEFAULT '0',
  PRIMARY KEY ('id'),
  KEY 'index_name' ('monotonically_increasing')
)

最佳答案

这实际上取决于您编写单调递增/递减值的速率。

小写负载

我不知道 Spanner 服务器在热点之前可以处理的每秒写入的确切范围(这取决于您的数据),但是如果您每秒写入 < 500 行,您应该可以接受图案。只有当您的写入负载高于单个 Spanner 服务器可以轻松处理的负载时,这才是问题。

大写负载

如果您的写入速率较大,或者相对不受限制(例如,随着您的系统/站点受欢迎程度而增加),那么您将需要寻找替代方案。这些替代方案实际上取决于您的具体用例,以确定您愿意做出哪些权衡。

一种通用方法是手动分片索引。比方说,您知道您的峰值写入负载将是每秒 1740 次插入。使用之前每个服务器大约 500 次写入,如果我们可以将此负载分片到 4 个 Spanner 服务器(每个 435 次写入/秒),我们将能够避免热点。

在 Cloud Spanner 中使用 INT64 类型允许的最大值为 9,223,372,036,854,775,808。分片的一种示例方法是我们通过将 random(0,3)*1,000,000,000,000,000,000 添加到每个值。这会将索引键范围拆分为 4 个范围,可由 4 个 Spanner 服务器提供服务。缺点是您需要执行 4 次查询并在屏蔽掉 x,000,000,000,000,000,000 之后在客户端合并结果。

注意:交错是指一个表中的数据/索引与另一个表中的日期交错。您不能只与一张 table 交错。

关于mysql - 如何索引表中单调递增的数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576388/

相关文章:

google-cloud-platform - GCP IAM : Binding role to Service Account fails

sql - 获取下一个未使用的ID的最有效方法

mysql - 选择并更新 SQL 表(一键完成)

mysql - 如何在没有base64编码的情况下将blob数据从ruby提交到MySQL

node.js - 使用 NodeJS 将文件上传到谷歌云存储

machine-learning - AI Platform(ML Engine)如何为作业分配资源?

r - SVM 在 R 中具有相同输入和参数的不同结果

c# - MVC3 和 session 可扩展性

mysql - 带 hibernate 功能的 Spring Boot : Auto-generating database schema with columns which can holds fractions of seconds

java - "java.sql.SQLException: No database selected"与 MySQL JDBC