Einschränkungen, bevor eine Tabelle fragmentiert oder partitioniert werden kann
P粉190883225
P粉190883225 2024-01-16 13:32:16
0
1
406

Ich bin neu im Datenbanksystemdesign. Nachdem ich viele Artikel gelesen habe, bin ich wirklich verwirrt, wie hoch die Grenze ist, die wir für eine Tabelle ohne Sharding oder Partitionierung haben sollten. Ich weiß, dass es wirklich schwierig ist, eine allgemeingültige Antwort zu geben, die Dinge hängen von Faktoren wie

ab
  • Zeilengröße
  • Datentyp (String, Blob usw.)
  • Anzahl aktiver Anfragen
  • Was für eine Anfrage
  • Index
  • Neu lesen/neu schreiben
  • Erwartete Verzögerungen

Aber wenn jemand diese Frage stellt

  • Was würden Sie tun, wenn jeden Tag 1 Milliarde Daten und Millionen Zeilen hinzugefügt würden? Bei einer so großen Datenbank muss die Latenz für eine Abfrage mit vier Lesevorgängen, einem Schreibvorgang und zwei Aktualisierungsabfragen weniger als 5 Millisekunden betragen.
  • Wenn Sie nur 10 Millionen Zeilen, aber ein hohes Aktualisierungs- und Lesevolumen hätten, was würden Sie wählen? Die Anzahl der hinzugefügten neuen Zeilen spielt keine Rolle. Hohe Konsistenz und geringe Latenz sind Anforderungen.

Wenn die Anzahl der Zeilen weniger als eine Million beträgt und die Zeilengröße um Tausende zunimmt, ist die Auswahl einfach. Schwieriger wird es jedoch, wenn die Auswahl Millionen oder Milliarden Zeilen umfasst.

Hinweis: Ich habe die Verzögerungsnummer in der Frage nicht erwähnt. Bitte Antworten Sie basierend auf der Anzahl der Verzögerungen, mit denen Sie zufrieden sind. Außerdem sprechen wir über strukturierte Daten.

Ich bin mir nicht sicher, aber ich kann drei spezifische Fragen hinzufügen:

  • Angenommen, Sie entscheiden sich für eine SQL-Datenbank für Amazon oder ein anderes E-Commerce-Auftragsverwaltungssystem. Die Zahl der Bestellungen wächst täglich um Millionen. Es gibt bereits 1 Milliarde Datensätze. Nehmen wir nun an, dass kein Datenarchiv vorhanden ist. High-Read-Abfragen mit über tausend Abfragen pro Sekunde. Und auch geschrieben. Das Lese-/Schreibverhältnis beträgt 100:1
  • Nehmen wir ein Beispiel einer jetzt kleineren Zahl. Angenommen, Sie wählen eine SQL-Datenbank für abc oder ein anderes E-Commerce-Auftragsverwaltungssystem. Die Zahl der Bestellungen steigt täglich um Tausende. Es gibt bereits 10 Millionen Datensätze. Nehmen wir nun an, dass kein Datenarchiv vorhanden ist. High-Read-Abfragen mit über zehntausend Abfragen pro Sekunde. Und auch geschrieben. Das Lese- und Schreibverhältnis beträgt 10:1
  • Drittes Beispiel: Freebie-Verteilung. Wir haben 10 Millionen Goodies zu verschenken. 1 Goody pro Benutzer. Hohe Konsistenz und geringe Latenz sind die Ziele. Gehen wir davon aus, dass bereits 20 Millionen Nutzer auf die kostenlose Verteilung warten, werden alle, sobald die Zeit beginnt, versuchen, an die kostenlosen Extras zu kommen.

Hinweis: Bei dieser Frage wird davon ausgegangen, dass wir eine Auswahl treffen SQL-Lösung. Auch wenn der bereitgestellte Anwendungsfall keinen logischen Sinn ergibt, ignorieren Sie ihn. Ziel ist der Erwerb numerischer Kenntnisse.

Kann mir jemand helfen, den Benchmark zu verstehen? Alle reellen Zahlen aus dem Projekt, an dem Sie gerade arbeiten, zeigen, dass es sich bei einer großen Datenbank mit so vielen Abfragen um die beobachtete Latenz handelt. Alles, was mir helfen kann, die Anzahl der ausgewählten Tabellen für eine bestimmte Anzahl von Abfragen und eine bestimmte Latenz zu rechtfertigen.

P粉190883225
P粉190883225

Antworte allen(1)
P粉401901266

MySQL 的一些答案。由于所有数据库都受到磁盘空间、网络延迟等限制,其他引擎可能类似。

  • 无论行数有多少,“点查询”(使用合适的索引获取一行)都需要几毫秒。
  • 编写一个需要数小时甚至数天才能运行的SELECT是可能的。所以你需要了解查询是否是这样病态的。 (我认为这是高“延迟”的一个例子。)
  • 当您无法维持单个服务器上所需的写入数量时,就需要“分片”。
  • 通过使用复制并将读取发送到副本,可以“无限”扩展大量读取。
  • PARTITIONing(尤其是在 MySQL 中)的用途很少。更多详细信息:分区
  • INDEX 对于性能非常重要。
  • 对于数据仓库应用,构建和维护“汇总表”对于大规模性能至关重要。 (其他一些引擎有一些内置的工具。)
  • 每天插入一百万行不是问题。 (当然,有些模式设计可能会导致这个问题。)经验法则:100/秒可能不是问题; 1000/秒可能是可能的;之后就变得更难了。更多关于高速摄取
  • 网络延迟主要取决于客户端和服务器的距离。到达地球的另一边需要超过200毫秒。另一方面,如果客户端和服务器位于同一栋楼内,则延迟会低于 1 毫秒。另一方面,如果您指的是运行查询需要多长时间,那么这里有一些经验法则: 对于需要命中 HDD 磁盘的简单查询,需要 10 毫秒; SSD 为 1 毫秒。
  • 如果数据太大而无法缓存在 RAM 中,UUID 和哈希值对性能非常不利。
  • 我没有提及读/写比,因为我更喜欢独立判断读和写。
  • “每秒万读”很难实现;我认为很少有应用程序真正需要这样的。或者他们可以找到更好的方法来实现相同的目标。一个用户发出查询的速度有多快?也许每秒一个?有多少用户可以同时连接和活动?数百个。
  • (我的观点)大多数基准测试都是无用的。一些基准测试可以表明一个系统的速度是另一个系统的两倍。所以呢?一些基准测试表明,当您有超过数百个活动连接时,吞吐量就会停滞,并且延迟会趋于无穷大。所以呢。当应用程序运行一段时间后,捕获实际查询可能是最好的基准。但它的用途仍然有限。
  • 几乎总是单个表比拆分表(多个表;分区;分片)更好。如果您有具体的例子,我们可以讨论一下表格设计的优缺点。
  • 行的大小和数据类型——大列(TEXT/BLOB/JSON)被“不记录”存储,从而[可能]导致额外的磁盘命中。磁盘命中是任何查询中成本最高的部分。
  • 活跃查询——几十次之后,查询就会相互冲突。 (想象一下杂货店里有很多推着购物车的购物者——“太多”的购物者,每个人都需要很长时间才能完成。)

当您进入大型数据库时,它们分为几种不同的类型;每个都有一些不同的特征。

  • 数据仓库(传感器、日志等)——附加到表的“末尾”;高效“报告”的汇总表;巨大的“事实”表(可选择分块存档);某些“维度表”。
  • 搜索(产品、网页等)——EAV 有问题;全文通常很有用。
  • 银行业务、订单处理 - 这对 ACID 功能和处理交易的需求非常重要。
  • 媒体(图像和视频)--如何存储庞大的对象,同时使搜索(等)相当快。
  • '查找最近的' - 需要一个 2D 索引,SPATIAL 或一些技术 此处
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!