Ich bin damit einverstanden, dass INDEX(region_code_id, local_number)
(in beliebiger Reihenfolge) für dieses Problem ist obligatorisch, aber Ich stecke meine Nase rein, um einen Schritt weiter zu gehen. Ist das Paar nicht "einzigartig"? Oder haben Sie doppelte Nummern in der Tabelle? Wenn es einzigartig ist, dann loswerden id
und machen dieses Paar PRIMARY KEY(region_code_id, local_number)
. Die Tabelle wird möglicherweise nach der Änderung kleiner sein.
Zurück zu Ihrer Frage "wie groß". Wie groß ist der Tisch jetzt? Vielleicht 40 GB? Ein Sekundärindex (wie ursprünglich vorgeschlagen) würde wahrscheinlich über 20GB hinzufügen. Und Sie würden 20-60GB freien Speicherplatz benötigen, um die ALTER
durchzuführen. Dies hängt davon ab, ob das Hinzufügen des Index in dieser Version "inplace" erfolgen kann.
Ändern der PK (wie ich vorschlagen) würde etwas weniger als 40 GB für die Tabelle ergeben. Es werden 40 GB freier Speicherplatz benötigt, um die ALTER
durchzuführen.
Im Allgemeinen (und pessimistisch), planen Sie auf ALTER
benötigen die sowohl die ursprüngliche Tabelle und die neue Tabelle, die auf Platte auf einmal sitzt. Dazu gehören vollständige Kopien der Daten und Index (e).
(A-Seite Frage: Sind Sie sicher, local_number
überall auf 7 Stellen begrenzt ist)
Ein weiterer Ansatz für die Frage ... Für die Größe einer Tabelle oder ein Index in InnoDB Berechnung, fügen Sie die Datentyp-Größen bis (3 Bytes für , einige Durchschnitt für VARCHAR
, usw.). Dann multiplizieren Sie mit der Anzahl der Zeilen. Dann multipliziere mit 4; Dadurch erhalten Sie ungefähr den benötigten Speicherplatz. (In der Regel ist 2-3 ausreichend für den letzten Multiplikator.)
Wenn die PK zu ändern, tun Sie es in einem Schritt:
ALTER TABLE foo
DROP PRIMARY KEY,
ADD PRIMARY KEY(region_code_id, local_number);
Ändern der PK kann nicht "Inplace" erfolgen.
bearbeiten (meist für andere Leser)
@berap weist darauf hin, dass id
für andere Zwecke benötigt wird. Daher ist es nicht möglich, id
zu löschen und den PK zu wechseln.
Dies ist jedoch manchmal eine Option (vielleicht nicht in diesem Fall):
ALTER TABLE foo
DROP PRIMARY KEY,
ADD PRIMARY KEY(region_code_id, local_number),
ADD INDEX(id);
Hinweise:
- Die
id..AUTO_INCREMENT
wird weiterhin auch INDEX
mit nur arbeiten.
- Die fragliche
SELECT
wird effizienter sein, weil es die PK ist.
SELECT .. WHERE id = ...
wird weniger effizient sein, weil id
ein sekundärer Schlüssel ist.
- Die Tabelle hat die gleiche Größe; der Sekundärschlüssel hätte auch die gleiche Größe - weil jeder Sekundärschlüssel auch die PK-Spalten enthält. (Dieser Hinweis ist InnoDB-spezifisch.)
Haben Sie einen Index für (region_code_id, local_number)? –
Suchen Sie nach indizierten Spalten? Wie groß ist der Tisch und kann er in den Speicher für schnellere Suche passen? Wie lauten die Servereinstellungen für die Datenbank? Auf welcher Hardware läuft es? – gabe3886