webdevqa.jp.net

MySQLで優先度の低いクエリを実行できますか?

3GBのデータを含むMySQLテーブルがあり、新しいフィールドを作成するためのALTER TABLEは、実稼働前に約15分間続きます。

このソフトウェアは、新しいフィールドがある場合とない場合の両方で読み取りと書き込みの両方のクエリを実行できるため、ソフトウェアを変更せずにデータベースを更新できます。

質問:

これを「バックグラウンド」のような方法で実行し、すべてのCPUサイクルを最初に「その他のクエリ」に参加させ、空きCPUがある場合にのみ、ALTERを実行する方法はありますか?

本番環境で「ロングアルターテーブル」を実行する正しい方法は何ですか?

1
Xavi Montero

CPUが本当のボトルネックになることはめったにありません。これは通常ディスクであり、バッファプールで使用可能なメモリの量も制約になります。

問題は、ALTER TABLEを実行するために必要なリソースは通常、実際の問題ではないということです...操作中にテーブルがロックされる可能性が高いという事実です。

MySQLでクエリの優先順位を下げる方法はありませんが、優先順位を下げると、テーブルレベルのロックが長く続くため、苦痛が長引くだけである可能性があります。

これを試して:

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

サーバーがこれを許可しない場合(これで問題が解決するはずです)、エラーメッセージで理由を説明する必要があります。

理由が外部キーに関連しているにもかかわらず、ALTERクエリが外部キーの整合性を妨げることはない場合は、ロックなしでインプレース変更を実行できないようにするチェックを無効にすることができます。

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

これはnotテーブルの外部キー制約を無効にしません。現在の接続から実行するクエリは、リレーショナル整合性の違反を回避するための手順を実行する必要性から免除されるだけです。リレーショナル整合性を乱すために何もしていない限り、それを使用するのは安全な戦略ですが、それは必要な場合に限られます。

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

1

はい、できます。 簡単なGoogle検索でこの回答が見つかりました 姉妹​​SEサイト: https://stackoverflow.com/questions/24704086/low-priority-query-in-mysql

実行するクエリのタイプに応じて、クエリでLOW_PRIORITYまたはHIGH_PRIORITYを使用できます。

INSERT [LOW_PRIORITY | HIGH_PRIORITY] INTO ...
SELECT [HIGH_PRIORITY] * FROM ...
UPDATE [LOW_PRIORITY] table ...
1
music2myear