ビジネスインテリジェンスの担当者は、より高速なマシンや最新のソフトウェアなどを求めており、一部の顧客は1時間を超えるクエリ時間について不満を持っています。ツールはCognos/Insightであり、DBはマスターMySQLの複製コピーであり、まもなくMariaDBに移行します。
私の直感は(SQLと実行プランに取り掛かる前に)、Cognosからの最適化が不十分なクエリと、それらをサポートするための不適切なインデックスのコレクションを処理しているだけだということです。
私の質問は(私が解決策を注文する前に):マスターテーブルに存在しないインデックスを許可するリアルタイムスレーブテーブルの受け入れられた戦略はありますか?
遅いクエリログ および log_queries_not_using_indexes
スレーブサーバー上で、腸が何を言っているかを確認できるはずです。キャプチャされたクエリを取得し、それらに対してEXPLAIN
を実行して、疑惑のより良いドキュメントを作成できます。
質問にもっと直接的に答えるには、マスターで宣言されていないスレーブでインデックスを宣言することは絶対に有効です。これは一般的な方法であり、レプリカが非常に多くのことに役立つ理由の1つであることをお勧めします。十分な権限を持つアカウントでスレーブに接続し、スレーブで直接テーブルを変更します。
これに対する唯一の例外は、行データがマスターとレプリカで一貫している必要があるため、直感的に明らかなはずですが、スレーブでUNIQUE
制約または外部キー制約を安全に宣言できないことです。マスターには存在しません。とにかく意味がないので、これはうまくいきません。
MySQLのインデックスには名前があり、インデックスの追加時に指定されていない場合は自動的に生成されることにも注意してください。レプリカでこれらのインデックスに明示的に名前を付けて、マスターに追加される将来のインデックスがインデックス名の衝突を引き起こさないようにすることをお勧めします。これにより、レプリケーションが中断されます。私の地元の慣習では、インデックス名の前に「ix_repl_」を付けます。これはもちろんマスターでは使用されません。
ALTER TABLE t1 ADD KEY ix_repl_last_first (last_name,first_name);
また、適切な重複インデックス(正確に同じ列が複数のインデックスに含まれている場合)はMySQL 5.6で非推奨になり、許可されないことにも注意してください。 MySQL 5.7のデフォルトでは、マスターで同じインデックス(名前が異なっていても)を後で宣言すると、以降のバージョンでレプリケーションが停止する可能性があります。スレーブSQLスレッドを再起動する前に、レプリカの冗長になったインデックスを削除するだけでレプリケーションを安全に再起動できるため、これは重大な問題ではありません(レプリケーションを監視している限り、そうですよね?)。競合するインデックスがなく、置換インデックスがレプリカ上に構築されるため、失敗したイベントが再試行され、有効になります。
補足:MySQLレプリケーションでは、レプリカサーバー上のMySQLのバージョンがマスター上のバージョンと同じか、それよりも新しい必要があることに注意してください...したがって、アップグレード(またはMariaDBへの移行)するときは、ほぼ確実にアップグレードする必要があります。最初にレプリカ、次にマスター。これは、新しいレプリカは古いマスターの機能と癖を理解しますが、新しいマスターは、古いレプリカサーバーが解釈できない動作をレプリケーションストリームに導入する可能性があるためです。この規則には限られた例外がありますが、それは間違いなく規則です。