MySQL-Datenbankoptimierung: Detaillierte Erläuterung der Sharding-Operationen für Tabellen und Datenbanken

MySQL-Datenbankoptimierung: Detaillierte Erläuterung der Sharding-Operationen für Tabellen und Datenbanken

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 Unterdatenbank

Vertikale Teilung

Bei 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 Teilung

Die 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.
Sie denken vielleicht an Indizes. Was ist, wenn die Anzahl der Benutzer Hunderte Millionen erreicht? Wie kann man das optimieren?
Teilen Sie die Datenbanktabelle mithilfe der horizontalen Partitionierung auf.

So verwenden Sie eine horizontal geteilte Datenbank

Verwenden 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 teilen

Zuerst 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 Demoprojekt

POM-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:
  • Eine kurze Einführung in MySQL-Datenbankoptimierungstechniken
  • Verstehen Sie kurz die MySQL-Datenbankoptimierungsphase
  • MySQL-Datenbankoptimierung: Indeximplementierungsprinzip und Nutzungsanalyse
  • Detaillierte Erläuterung von acht Möglichkeiten zur Optimierung der MySQL-Datenbank (klassische Pflichtlektüre)
  • Einige Praktiken der MySQL-Standalone-Datenbankoptimierung
  • Zusammenfassung der MySQL-Datenbankoptimierungstechnologie und Kenntnisse zur Indexverwendung
  • Zusammenfassung der Konfigurationstechniken für die MySQL-Datenbankoptimierungstechnologie
  • Eine kurze Diskussion zur MySQL-Datenbankoptimierung aus Sicht von Betrieb und Wartung (Li Zhenliang)
  • Details zur MySQL-Datenbankoptimierung
  • 9 Tipps zur MySQL-Datenbankoptimierung

<<:  jQuery klickt auf den Liebeseffekt

>>:  JavaScript Canvas implementiert Tic-Tac-Toe-Spiel

Artikel empfehlen

XHTML-Tutorial: Der Unterschied zwischen Transitional und Strict

Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...

js, um einen simulierten Einkaufszentrumsfall zu erreichen

Freunde, die HTML-, CSS- und JS-Frontend lernen, ...

Detaillierte Erklärung der .bash_profile-Datei im Linux-System

Inhaltsverzeichnis 1. Umgebungsvariable $PATH: 2....

Eine kurze Erläuterung der vier häufig verwendeten Speicher-Engines in MySQL

Einführung in vier häufig verwendete MySQL-Engine...

Über das durch die HTML-Kodierung verursachte verstümmelte Problem

Heute hat ein Student im dritten Studienjahr eine...

Tutorial zum Herunterladen und Installieren von XFTP (grafisches Tutorial)

Wenn Sie Dateien zwischen Windows und Linux übert...

Drei Möglichkeiten zum Sperren und Entsperren von Benutzerkonten in Linux

Wenn in Ihrer Organisation bereits eine Kennwortr...

So implementieren Sie abgerundete Ecken mit CSS3 unter Verwendung von JS

Ich bin auf ein Beispiel gestoßen, als ich nach e...

Einführung in Abfragebefehle für gespeicherte MySQL-Prozeduren

Wie unten dargestellt: Wählen Sie den Namen aus m...

So richten Sie eine automatische tägliche Datenbanksicherung in Linux ein

Dieser Artikel verwendet das Centos7.6-System und...

Drei häufig verwendete MySQL-Datentypen

Das Definieren des Datenfeldtyps in MySQL ist für...

So legen Sie Hintergrundfarbe und Transparenz in Vue fest

Einstellungen für Hintergrundfarbe und Transparen...