Kann ich eine Abfrage mit niedriger Priorität unter MySQL ausführen?

1493
Xavi Montero

Ich habe eine MySQL-Tabelle mit 3 GB Daten und die ALTER TABLE zum Erstellen eines neuen Felds dauert in der Vorproduktion etwa 15 Minuten.

Die Software kann sowohl Lese- als auch Schreibabfragen mit dem neuen Feld oder ohne dieses durchführen, sodass ich die Datenbank aktualisieren kann, ohne die Software zu ändern.

Frage:

Gibt es eine Möglichkeit, dies auf eine Art "Hintergrund" auszuführen, und alle CPU-Zyklen zuerst die "anderen Abfragen" ausführen lassen und nur dann, wenn eine freie CPU vorhanden ist, ALTER ausführen?

Was ist der richtige Weg, um eine "lange Änderungstabelle" in der Produktion auszuführen?

1
Ohne die tatsächliche Abfrage zu kennen und Details über die Abfrage zu kennen, kann Ihnen niemand wirklich eine solide Antwort geben. JakeGould vor 6 Jahren 0
Sicherlich zu weit gefasst ... Sie müssen die Leistung der Abfrage erhöhen, dann überlegen Sie, ob Sie die Abfrage zu einer gespeicherten Prozedur machen und dann die Prozedur aufrufen oder ausführen möchten, anstatt die Abfrage aus der App zu senden. Verwenden Sie [explain] (https.) : //dev.mysql.com/doc/refman/5.7/de/explain.html) und [Status wie 'last_query_cost' anzeigen] (https://dev.mysql.com/doc/refman/5.7/de/server) -status-variables.html # statvar_Last_query_cost) nach Ausführung der Abfrage, um zu erfahren, wie Sie die Leistung steigern können und wie SQL hinter den Kulissen funktioniert usw. Pimp Juice IT vor 6 Jahren 0

2 Antworten auf die Frage

2
music2myear

Ja, du kannst. Eine einfache Google-Suche fand diese Antwort auf unserer Schwester-SE-Site: https://stackoverflow.com/questions/24704086/low-priority-query-in-mysql

Sie können LOW_PRIORITY oder HIGH_PRIORITY in Ihren Abfragen verwenden, je nachdem, welche Art von Abfrage Sie ausführen:

INSERT [LOW_PRIORITY | HIGH_PRIORITY] INTO ... SELECT [HIGH_PRIORITY] * FROM ... UPDATE [LOW_PRIORITY] table ... 
1
Michael - sqlbot

CPU ist selten der eigentliche Engpass. Normalerweise handelt es sich dabei um die Festplatte, wobei der für den Pufferpool verfügbare Speicherplatz auch eine Einschränkung ist.

Das Problem ist, dass die erforderlichen Ressourcen ALTER TABLEnormalerweise nicht Ihr eigentliches Problem sind. Es ist die Tatsache, dass die Tabelle während des Vorgangs wahrscheinlich gesperrt wird.

Es gibt keine Möglichkeit, Abfragen in MySQL zu priorisieren, aber wenn dies der Fall wäre, würde dies wahrscheinlich nur Ihre Agonie verlängern, da die Sperre auf Tabellenebene nur länger bestehen bleibt.

Versuche dies:

ALTER TABLE t1 ADD COLUMN c2 BIGINT UNSIGNED NOT NULL AFTER c1, LOCK=NONE, ALGORITHM=INPLACE; 

Wenn der Server dies nicht zulässt - was das Problem lösen sollte -, sollte die Fehlermeldung den Grund dafür angeben.

Wenn der Grund auf Fremdschlüssel zurückzuführen ist und die Fremdschlüsselintegrität durch Ihre ALTERAbfrage nicht beeinträchtigt wird, können Sie die Prüfungen deaktivieren, die Sie daran hindern, eine In-Place-Änderung ohne Sperren durchzuführen.

SET @@FOREIGN_KEY_CHECKS = 0; -- before ALTER SET @@FOREIGN_KEY_CHECKS = 1; -- after ALTER 

Dadurch werden die Fremdschlüsseleinschränkungen für die Tabelle nicht deaktiviert. Es werden lediglich alle von Ihrer aktuellen Verbindung ausgeführten Abfragen von der Notwendigkeit ausgenommen, Maßnahmen zu ergreifen, um Verletzungen der relationalen Integrität zu vermeiden. Solange Sie nichts tun, um die relationale Integrität zu stören, ist dies eine sichere Strategie, aber nur, wenn Sie sie brauchen.

https://dev.mysql.com/doc/refman/5.7/de/alter-table.html