Behandelt MySQL Indizes immer noch auf diese Weise?

8

Das Löschen eines doppelten Index in MySQL dauerte ziemlich lange. Während ich wartete, suchte ich danach und fand diesen Beitrag aus dem Jahr 2006, in dem es darum ging, wie MySQL behandelt ADDund DROPindexiert.

Wenn eine Tabelle T eine MySQL-Tabelle mit vier Indizes (ndx1, ndx2, ndx3, ndx4) ist und Sie den Drop-Index ndx3 für Tabelle T ändern möchten; Hier ist genau das, was unter der Haube passiert:

1) MySQL kopiert T.MYD in eine temporäre Tabelle, dh S.MYD und ein Nullbyte S.MYI. 2) MySQL ändert die Tabelle S und fügt den Index ndx1 (...) hinzu. 3) MySQL ändert die Tabelle S und fügt den Index ndx2 (...) hinzu. 4) MySQL ändert die Tabelle S und fügt den Index ndx4 (...) hinzu. 5) MySQL löscht T.MYD und löscht T.MYI. 6) MySQL benennt S.MYD in T.MYD um und benennt S.MYI in T.MYI um

Ist das noch wahr? Ist sein Rat noch gültig?

Bei derselben MyISAM-Tabelle T mit vier Indizes (ndx1, ndx2, ndx3, ndx4) möchten Sie den Drop-Index ndx3 für Tabelle T ändern. Versuchen Sie dies stattdessen:

1) Tabelle T1 wie T erstellen; Dadurch wird eine leere Tabelle T1 mit den Indizes ndx1, ndx2, ndx3 und ndx4 erstellt. 2) Tabelle T1 Drop Index ndx3 ändern; Dadurch wird der Index ndx3 auf dem leeren T1 gelöscht, was sofort erfolgen sollte. 3) in T1 einfügen select * from T; Dadurch wird die Tabelle T gefüllt und alle drei (3) Indizes für T1 in einem Durchgang geladen. 4) Drop Table Table T; 5) Tabelle T1 in T umbenennen;

Wie gehen Sie alle mit dem Hinzufügen und Entfernen von Indizes zu großen Tabellen um?

JIStone
quelle

Antworten:

14

So hat MySQL 4.x das gemacht und es hat mich sehr erschüttert.

Tatsächlich gab es eine Formel, die ich berechnet hatte, wie viele solcher Indexmanöver benötigt wurden

Table with 0 indexes and adding 1 index tooks 1 temp table
Table with 1 index   and adding 1 index tooks 3 temp tables
Table with 2 indexes and adding 1 index tooks 6 temp tables
Table with 3 indexes and adding 1 index tooks 10 temp tables (I had eyewitnessed this !!!)
.
.
.
Table with n indexes and adding 1 index took (n + 1) X (n + 2) / 2 temp tables
.
.
.
Table with 16 indexes and adding 1 index took 153 temp tables

Gute Nachricht, MySQL 5.x macht das nicht !!!

Wenn MySQL 5.x dies tun würde, wäre ich heute ein PostgreSQL-DBA (keine Beleidigung für PostgreSQL, es ist ein ausgezeichnetes RDBMS für sich).

AKTUALISIEREN

Oh mein Gott, ich habe den Beitrag gelesen !!! Dieser Beitrag kam von mir !!!

Ich hätte nie gedacht, dass jemand diesen Beitrag ausgraben würde.

Bitte lassen Sie solche Sachen tot und begraben. Jetzt habe ich Rückblenden !!!

RolandoMySQLDBA
quelle