Dieser Artikel veranschaulicht anhand von Beispielen die Tabellen- und Datenbank-Sharding-Operationen zur MySQL-Datenbankoptimierung. Teilen Sie uns die Einzelheiten zu Ihrer Information mit: Untertabelle und UnterdatenbankVertikale TeilungBei der vertikalen Aufteilung wird die Tabelle nach Modulen in verschiedene Datenbanktabellen aufgeteilt (natürlich besteht das Prinzip darin, die dritte Normalform nicht zu zerstören). Diese Art der Aufteilung ist bei der Entwicklung großer Websites sehr verbreitet. Wenn eine Website noch sehr klein ist, gibt es nur wenige Leute, die sie entwickeln und pflegen, und alle Module und Tabellen sind zusammen. Wenn die Website weiter bereichert wird und wächst, wird sie von mehreren Subsystemen unterstützt. Zu diesem Zeitpunkt besteht die Notwendigkeit, die Tabellen nach Modulen und Funktionen aufzuteilen. Tatsächlich ist die serviceorientierte Transformation im Vergleich zur vertikalen Segmentierung ein Schritt weiter. Einfach ausgedrückt geht es dabei darum, das ursprünglich stark gekoppelte System in mehrere schwach gekoppelte Dienste aufzuteilen und Geschäftsanforderungen durch Aufrufe zwischen den Diensten zu erfüllen. Daher muss die Tabelle nach der Aufteilung in Form von Diensten bereitgestellt werden, anstatt Tabellen verschiedener Module direkt aufzurufen. Der wichtigste Teil der kontinuierlichen Weiterentwicklung der Architektur von Taobao ist die serviceorientierte Transformation. Das Extrahieren von Kernkonzepten wie Benutzern, Transaktionen, Geschäften und Produkten in unabhängige Dienste ist auch sehr förderlich für die lokale Optimierung und Verwaltung und gewährleistet die Stabilität der Kernmodule. Die vertikale Aufteilung wird in verteilten Szenarien verwendet. Horizontale TeilungDie oben erwähnte vertikale Aufteilung unterteilt die Tabelle nur nach Modulen in verschiedene Datenbanken, löst jedoch nicht das Problem großer Datenmengen in einer einzelnen Tabelle. Bei der horizontalen Aufteilung werden die Daten einer Tabelle nach bestimmten Regeln in verschiedene Tabellen oder Datenbanken unterteilt. Beispielsweise ist es in einem Abrechnungssystem sinnvoller, die Tabelle nach Zeit zu unterteilen, da das System Daten innerhalb eines bestimmten Zeitraums verarbeitet. Für SaaS-Anwendungen ist es sinnvoller, die Daten nach Benutzerdimension aufzuteilen, da die Benutzer voneinander isoliert sind und im Allgemeinen keine Notwendigkeit besteht, mehrere Benutzerdaten zu verarbeiten. Teilen Sie die Daten einfach horizontal nach dem Benutzer-ID-Bereich auf. Einfach ausgedrückt: Zeilen horizontal aufteilen, Zeilendaten in verschiedene Tabellen aufteilen, Spalten vertikal aufteilen, Tabellendaten in verschiedene Tabellen aufteilen Split Horizon-Beispiel Idee: In großen E-Commerce-Systemen steigt die Zahl der Mitglieder täglich weiter an. So optimieren Sie Abfragen, nachdem ein bestimmter Engpass erreicht wurde. So verwenden Sie eine horizontal geteilte DatenbankVerwenden Sie die horizontale Partitionierung, um die Tabelle je nach Geschäftsanforderungen aufzuteilen. Einige basieren auf Registrierungszeit, Lotterie, Kontoregeln, Jahr usw. Verwenden Sie die Touch-Methode, um die Tabelle zu teilenZuerst erstelle ich drei Tabellen: user0 / user1 / user2 und dann erstelle ich die UUID-Tabelle, die zum Bereitstellen automatisch inkrementierter IDs verwendet wird. Tabelle erstellen user0( id int vorzeichenloser Primärschlüssel, Name varchar(32) nicht null Standard '', pwd varchar(32) nicht null Standard '') Engine=Myisam-Zeichensatz UTF8; Tabelle Benutzer1 erstellen( id int vorzeichenloser Primärschlüssel, Name varchar(32) nicht null Standard '', pwd varchar(32) nicht null Standard '') Engine=Myisam-Zeichensatz UTF8; Tabelle Benutzer2 erstellen( id int vorzeichenloser Primärschlüssel, Name varchar(32) nicht null Standard '', pwd varchar(32) nicht null Standard '') Engine=Myisam-Zeichensatz UTF8; Tabelle UUID erstellen( ID Int vorzeichenloser Primärschlüssel (auto_increment)engine=myisam charset utf8; Erstellen Sie ein DemoprojektPOM-Datei <übergeordnetes Element> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.3.RELEASE</version> </übergeordnet> <Abhängigkeiten> <Abhängigkeit> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </Abhängigkeit> <Abhängigkeit> <groupId>org.springframework.boot</groupId> <artifactId>Spring-Boot-Starter</artifactId> </Abhängigkeit> <Abhängigkeit> <groupId>org.springframework.boot</groupId> <artifactId>Spring-Boot-Starter-Test</artifactId> <scope>Test</scope> </Abhängigkeit> <Abhängigkeit> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </Abhängigkeit> <Abhängigkeit> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </Abhängigkeit> </Abhängigkeiten> Dienstcode @Service öffentliche Klasse UserService { @Autowired private Jdbc-Vorlage jdbc-Vorlage; öffentliche String-Registrierung (String-Name, String-Passwort) { // 1. Holen Sie sich zuerst die benutzerdefinierte Wachstums-ID String idInsertSQL = "INSERT INTO uuid VALUES (NULL);"; jdbcTemplate.update(idInsertSQL); Long insertId = jdbcTemplate.queryForObject("wählen Sie last_insert_id() aus", Long.class); // 2. Bestimmen Sie den Namen der Speichertabelle String tableName = "user" + insertId % 3; // 3. Registrierungsdaten String insertUserSql = "INSERT INTO " + tableName + " VALUES ('" + insertId + "','" + name + "','" + pwd + "');"; System.out.println("insertUserSql:" + insertUserSql); jdbcTemplate.update(BenutzerSql einfügen); gebe "Erfolg" zurück; } öffentliche Zeichenfolge get(Lange ID) { String tableName = "Benutzer" + id % 3; String sql = "Wählen Sie Namen aus " + tableName + ", wobei id="+id; System.out.println("SQL:" + sql); Stringname = jdbcTemplate.queryForObject(sql, String.class); Rückgabename; } } Regler @RestController öffentliche Klasse UserController { @Autowired privater Benutzerdienst Benutzerdienst; @RequestMapping("/regit") öffentliche String-Registrierung (String-Name, String-Passwort) { gibt userService.regit(Name, Passwort) zurück; } @RequestMapping("/get") öffentliche Zeichenfolge get(Lange ID) { Zeichenfolgename = userService.get(id); Rückgabename; } } Leser, die an weiteren MySQL-bezogenen Inhalten interessiert sind, können sich die folgenden Themen auf dieser Site ansehen: „MySQL-Abfragekenntnisse“, „Zusammenfassung der allgemeinen MySQL-Funktionen“, „MySQL-Protokolloperationskenntnisse“, „Zusammenfassung der MySQL-Transaktionsoperationskenntnisse“, „MySQL-gespeicherte Prozedurkenntnisse“ und „Zusammenfassung der MySQL-Datenbanksperrenkenntnisse“. Ich hoffe, dass dieser Artikel für jedermann beim Entwurf einer MySQL-Datenbank hilfreich ist. Das könnte Sie auch interessieren:
|
<<: jQuery klickt auf den Liebeseffekt
>>: JavaScript Canvas implementiert Tic-Tac-Toe-Spiel
1: Unterschiede bei Geschwindigkeit und Lademethod...
Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...
Freunde, die HTML-, CSS- und JS-Frontend lernen, ...
Inhaltsverzeichnis 1. Umgebungsvariable $PATH: 2....
Einführung in vier häufig verwendete MySQL-Engine...
Heute hat ein Student im dritten Studienjahr eine...
Wenn Sie Dateien zwischen Windows und Linux übert...
Wenn in Ihrer Organisation bereits eine Kennwortr...
Ich bin auf ein Beispiel gestoßen, als ich nach e...
Wie unten dargestellt: Wählen Sie den Namen aus m...
Dieser Artikel verwendet das Centos7.6-System und...
<br />Denken Sie zuerst an die Idee, zeichne...
Aktivieren Sie den Dienst, wenn Sie ihn benötigen...
Das Definieren des Datenfeldtyps in MySQL ist für...
Einstellungen für Hintergrundfarbe und Transparen...