Heim  >  Artikel  >  Datenbank  >  So fragen Sie nach der Aufteilung von MySQL in Datenbanken ab

So fragen Sie nach der Aufteilung von MySQL in Datenbanken ab

(*-*)浩
(*-*)浩Original
2019-05-28 17:38:077260Durchsuche

Die Strategie zum Aufteilen von Datenbanken und Tabellen hängt von den Projektanforderungen ab. Hier wird der herkömmliche Ansatz übernommen: Nehmen Sie gemäß der Methode zur Verwendung des Moduls an, dass wir über zwei horizontale Aufteilungsdatenbanken verfügen und jede Datenbank über zwei horizontale Aufteilungstabellen verfügt. 4 Tabellen werden bei der Abfrage standardmäßig nicht nach anderen Bedingungen sortiert. Angenommen, wir möchten die Daten auf Seite 41 abfragen und auf jeder Seite werden 10 Daten angezeigt

So fragen Sie nach der Aufteilung von MySQL in Datenbanken ab

Das erste:

ist auch das einfachste: Durch Hinzufügen einer zusätzlichen Zuordnungstabelle muss ein ID-Attribut in den Attributen vorhanden sein. Ob es ein Bibliotheks-ID-Attribut und eine Tabellen-ID gibt Attribut (das heißt, welche Nummerndatenbank und welche Tabelle) sind optional, da dies durch Verwenden des Moduls gemäß der ID ermittelt werden kann. Beachten Sie, dass es sich bei den in dieser Tabelle gespeicherten Daten um alle Daten handelt, der Vorteil jedoch darin besteht, dass es nur wenige gibt Attributspalten, und es gibt nur wenige Attributspalten, die Indizes bereitstellen. In diesem Fall müssen wir nur * aus brand_temp auswählen, wobei ... limit 400,10 (Fügen Sie die Daten auf Seite 41 ein, jede Seite zeigt 5 Datenelemente an ), und nachdem wir die ID erhalten haben, können wir sie in der entsprechenden Tabelle abfragen

Der zweite Typ:

Der leistungsintensivste, wenn wir wollen Um die Datensätze auf der ersten Seite abzufragen, lautet die SQL einer einzelnen Datenbank und einer einzelnen Tabelle: select * from db limit 0, 10; Wenn wir die Datenbank in Shards aufteilen, ist die Anweisung immer noch dieselbe, aber zu diesem Zeitpunkt haben wir Sie müssen die von den 4 Tabellen im Speicher zurückgegebenen Datensätze analysieren und dann eine aufsteigende Reihenfolge nach ID durchführen, um die ersten 10 Datenrückgaben zu erhalten ... Die Datenmenge ist gering. Es ist in Ordnung, wenn die Seitenzahl klein ist, aber wenn wir wollen Um die Daten auf Seite 2 abzufragen, wählen Sie im Fall einer monolithischen SQL-Architektur * aus db limit 10,10 aus. Dies ist jedoch in einer verteilten Datenbank nicht möglich, da die Daten sehr klein sind Dafür müssen alle abgefragt werden. Die SQL-Anweisung lautet: select * from db_x limit 0,10+10 // Dies bedeutet, dass die Anzahl der abzufragenden Datensätze auf der einzelnen Architektur plus die vorherigen Datensätze abgefragt werden müssen dann Führen Sie dann die von allen Tabellen im Speicher zurückgegebenen Datensätze zusammen, analysieren Sie sie und nehmen Sie schließlich die Datensätze ab dem 10. ... Es ist ersichtlich, dass, sobald die Anzahl der Seiten in dieser Lösung n Seiten erreicht, und die Anzahl der Die auf jeder Seite angezeigten Datensätze sind jeweils m Datensätze. Die Anzahl der Datensätze, die in der Tabelle abgefragt werden müssen, beträgt: (n-1)*m+m=nm Datensätze und die Anzahl der Datensätze, die im Speicher analysiert werden müssen Wenn die CPU nicht explodiert, verliere ich

Der dritte Typ:

übernimmt ein geschäftsbasiertes Modell: Benutzer dazu zwingen Es ist nicht möglich, Seitensprungabfragen durchzuführen. Das heißt, Benutzer können beim Durchsuchen nur auf die nächste oder vorherige Seite klicken. Die spezifische Methode besteht darin, die Anzahl der Datensätze abzufragen und den Maximalwert der aktuellen eindeutigen ID aufzuzeichnen Wert und fügen Sie dann bei der erneuten Abfrage die Where-Bedingung hinzu ... Beginnen wir von vorne: die erste Abfrage pageNum=1, pageSize=10, maxId =0->sql:select * from db_x where id>0 limit 10 ; Verteilen Sie es dann an die Tabelle der entsprechenden Bibliothek, führen Sie die erhaltenen 4 * 10 Daten zusammen und analysieren und sortieren Sie sie dann im Speicher, wobei die ersten 10 Teile verwendet werden. Gleichzeitig ist die ID = maxId des 10. Teils von Die Daten werden separat entnommen, gerendert und auf der Front-End-Seite gespeichert, sodass beim Klicken auf die nächste Seite auch maxId=10 übermittelt wird und die SQL zu „select * from db_x where id> limit“ wird Zum Parsen fahren Sie mit dem Speichern fort ... Die auf diese Weise zurückgegebenen Daten sind stabil und die Daten sind kohärent (Sortierung)

Die vierte Methode:

Das legendäre Beste Der Kern dieser Methode besteht aus zwei SQL-Abfragen:

Voraussetzung: Abfragen der Daten auf Seite 1001 und Anzeigen von 10 Elementen auf jeder Seite

1):我们先记录下要查询的记录数的范围:(1001-1)*10=10000 开始,10010结束->10000-10010
单体的sql为:select * from db limit 10000,10;
我们总共有4个表,意味着:每个表的start应该为10000/4=2500,从而sql变成了:
select * from db_x limit 2500,10;	//假设是平均分配的,因而我们可以均分,不均分也没关系,后续操作会补齐
我们会得到4个表中的记录:(因为我demo还没写,所以先手写了)
T1:(1,"a"),.......
T2:(2,"b"),.......
T3:(3,"c"),.......
T4:(4,"d"),.......
真实数据第1001页不可能是1开头的,将就着看吧,过几天会一起讲rabbitMQ分布式一致性和这个demo一起发布的
ok,第一阶段的sql查询结束

2):对4个表中返回的记录进行id匹配(id如果非整型,自行用hashCode匹配),因为是升序查询,所以我们只需要比较下每个表的首条记录
的id值即可,获得了最小的minId=1,和各个表最大的那个值maxId;ok,转换sql思路,这里我们采用条件查询了(弥补操作第一步):
select * from db_x where id between minId and maxId 这样我们就获取到了遗漏的数据(当然有多余的数据)
这样我们4个表中就返回了可能记录数各不相同的记录,第二步结束

3):
之后记录minId出现的位置,如T1出现的位置为2500,T2出现的位置为2500-2=2048 ,T3出现的位置为2500-3=2047 ,T4出现的位置
为2500-3=2047 则最终出现的记录数为:2500+2048+2047+2047=10000-2-3-3=9992,因此我们需要的查询的记录数需要从9992 依次往后取
8个开始,然后再取10个就是所求的数据,这种方式能做到数据精确查询,但是唯一的缺点就是每次查询都需要进行二次sql查询

Das obige ist der detaillierte Inhalt vonSo fragen Sie nach der Aufteilung von MySQL in Datenbanken ab. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn