Wenn ein Datenelement Millionen erreicht, erhöht sich die Zeit, die für eine Abfrage benötigt wird. Wenn es eine gemeinsame Abfrage gibt, kann es sein, dass sie dort stirbt. Der Zweck der Tabellenpartitionierung besteht darin, die Belastung der Datenbank zu verringern und die Abfragezeit zu verkürzen.
Untertabelle
1, MySQL-Cluster erstellen. Zum Beispiel: Verwendung von MySQL-Cluster, MySQL-Proxy, MySQL-Replikation, DRDB usw.
Einige Leute fragen sich vielleicht: Hat MySQL-Cluster etwas mit Untertabellen zu tun? Obwohl es sich nicht um einen Untertisch im eigentlichen Sinne handelt, übernimmt er die Rolle eines Untertisches. Was bedeutet es, ein Cluster zu sein? Um die Belastung einer Datenbank zu verringern, bedeutet dies, vereinfacht ausgedrückt, die Anzahl der SQLs in der SQL-Warteschlange zu verringern.
Zum Beispiel: Wenn diese 10 SQL-Anfragen in die Warteschlange eines Datenbankservers gestellt werden, müssen sie lange warten, wenn diese 10 SQL-Anfragen den Warteschlangen von 5 Datenbanken zugewiesen werden Server In der Warteschlange gibt es nur 2 Warteschlangen in einem Datenbankserver. Wird die Wartezeit erheblich verkürzt? Das ist bereits offensichtlich.
Vorteile: Gute Skalierbarkeit, keine komplexen Operationen (PHP-Code) nach mehreren Untertabellen
Nachteile: Die Datenmenge in einer einzelnen Tabelle hat sich nicht geändert und der Zeitaufwand für eine Operation Ist immer noch derselbe Viele, der Hardware-Overhead ist groß.
2. Es wird im Voraus geschätzt, dass es Tabellen mit großen Datenmengen geben wird, auf die häufig zugegriffen wird.
Diese Art der Schätzung ist hübsch Das Gleiche gilt für das Forum. Die Tabelle, in der Beiträge gepostet werden, wird mit der Zeit sicherlich sehr groß, möglicherweise Hunderttausende oder sogar Millionen. In der Informationstabelle im Chatroom plauderten Dutzende Menschen eine ganze Nacht lang miteinander. Nach langer Zeit müssen die Daten in dieser Tabelle sehr groß sein. Solche Situationen gibt es viele. Für diese Art von Big-Data-Skala, die geschätzt werden kann, teilen wir sie daher im Voraus in N-Tabellen auf. Die Anzahl von N hängt von der tatsächlichen Situation ab.
Vorteile: Vermeidung von Millionen von Daten in einer Tabelle, Verkürzung der Ausführungszeit einer SQL
Nachteile: Wenn eine Regel festgelegt ist, ist es sehr schwierig, diese Regel zu brechen. Problem Der Hash-Algorithmus, den ich im obigen Beispiel verwendet habe, ist crc32. Wenn ich diesen Algorithmus jetzt nicht verwenden möchte, führt der Wechsel zu md5 dazu, dass die Nachrichten desselben Benutzers in verschiedenen Tabellen gespeichert werden, sodass die Daten durcheinander geraten. Die Skalierbarkeit ist schlecht.
3. Verwenden Sie die Merge-Storage-Engine, um Untertabellen zu implementieren.
Ich denke, dass diese Methode ohne vorherige Überlegung besser geeignet ist Die Abfrage ist langsam. Zu diesem Zeitpunkt ist es schwieriger, die vorhandenen Big-Data-Skalen zu trennen. Am schmerzhaftesten ist es, den Code zu ändern, da die SQL-Anweisungen im Programm bereits geschrieben wurden. Jetzt muss eine Tabelle in Dutzende oder sogar Hunderte von Tabellen unterteilt werden. Bedeutet das, dass die SQL-Anweisung neu geschrieben werden muss? Ich verwende zum Beispiel gerne
mysql>show engine und Sie werden feststellen, dass mrg_myisam tatsächlich merge ist.
mysql> CREATE TABLE IF NOT EXISTS `user1` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.05 sec) mysql> CREATE TABLE IF NOT EXISTS `user2` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> PRIMARY KEY (`id`) -> ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO `user1` (`name`, `sex`) VALUES('张映', 0); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO `user2` (`name`, `sex`) VALUES('tank', 1); Query OK, 1 row affected (0.00 sec) mysql> CREATE TABLE IF NOT EXISTS `alluser` ( -> `id` int(11) NOT NULL AUTO_INCREMENT, -> `name` varchar(50) DEFAULT NULL, -> `sex` int(1) NOT NULL DEFAULT '0', -> INDEX(id) -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> select id,name,sex from alluser; +----+--------+-----+ | id | name | sex | +----+--------+-----+ | 1 | 张映 | 0 | | 1 | tank | 1 | +----+--------+-----+ 2 rows in set (0.00 sec) mysql> INSERT INTO `alluser` (`name`, `sex`) VALUES('tank2', 0); Query OK, 1 row affected (0.00 sec) mysql> select id,name,sex from user2 -> ; +----+-------+-----+ | id | name | sex | +----+-------+-----+ | 1 | tank | 1 | | 2 | tank2 | 0 | +----+-------+-----+ 2 rows in set (0.00 sec)
Vorteile: Gute Skalierbarkeit und der Programmcode ändert sich nicht viel
Nachteile: Die Wirkung dieser Methode ist etwas schlechter als die der zweiten
Das obige ist der detaillierte Inhalt vonSo teilen Sie Tabellen in MySQL auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!