3

フェデレーション テーブル エンジンに関する問題があります。

妥当な大きさのリモート テーブル (約 800.000 行、行サイズ 211 バイト、MyISAM) を指す連合テーブルを作成しました。

次のクエリを送信する場合:

SELECT * FROM TABLE LIMIT 0,30

クエリの完了には常に 9 秒かかります。

しようとしている:

SELECT * FROM TABLE WHERE primaryKey = 1234

通常どおり高速です (< 0.001 秒)。

複数のデータベースサーバーで連合テーブルを試してみましたが、常に同じ結果になりました。ここで私の質問は、私が知らないカーテンの後ろで何かが起こっているのでしょうか? Mysql は WHERE 句なしでインデックス全体を取得しますか? 内部ソートは必要ですか?

とにかく、私の意見では、データを提供するリモート db サーバーはこれを遅滞なく処理する必要がありますね。

Mysql version: 5.5.31

4

1 に答える 1

1

FEDERATED多くの問題を抱えています。基本的に、一度に 1 行ずつ送信するように他のマシンに要求します。これには往復のオーバーヘッドがかかります。

FEDERATEDオプティマイザーは、特に で、他のサーバーへの「プッシュ ダウン」操作があまり得意ではありません。つまり、他のサーバーで実行できる作業を引き渡すのではなく、レコードを要求し、クエリを開始するサーバーで作業を行います。

(< 0.001s) のようなタイミングに注意してください。これは通常、クエリ キャッシュがオンになっていて、クエリが実際に実行されたのではなく、QC からフェッチされたことを意味します。ではFEDERATED、QC を正しく維持できないため、自動的に無効にするか、無効にする必要があります。(どちらかわかりません。)

SELECT * FROM TABLE 制限 0,30

それはインデックスをフェッチしません。「データ」から行をフェッチします。30 行 (.MYD の最初の 30 行) をフェッチしてから終了することを期待します。しかしFEDERATED、それよりもばかげている可能性があります。

の場合は他MyISAMのキーPRIMARY KEYと同じです。UNIQUE

何が起こっているのかについてさらに洞察を得る 1 つの方法:

FLUSH STATUS;
SELECT * FROM TABLE LIMIT 0,30;
SHOW SESSION STATUS LIKE 'Handler%';

約 30 のハンドラーが 1 つまたは 2 つあると予想さFEDERATEDれますLIMIT

于 2015-04-29T05:56:42.300 に答える