0

私は6000万以上のレコードを持つデータベースを持っています。現在の設定では、3,000万以上のテーブルが1つと、それぞれに500万(ish)の小さなテーブルがいくつかあります。データ構造は各テーブルで同じです。初めて検索を作成した人(私がここに来る前の3〜4年前)は、複数の小さなテーブルを使用していました。match againstそれぞれに結合を使用しています。私の上司と彼は、複数のテーブルを使用するとMySQLが各テーブルを同時に検索できるという印象を受けました。私が読んだすべての中で、誰もが1つの大きなテーブルの方が良いと言っていますが、3000万以上のテーブルが大きくなるにつれて、40秒以上かかることもあります。これは本来よりも遅いですか?

選択ステートメント

SELECT $stuff FROM table1 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table2 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table3 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table4 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table5 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table6 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table7 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table8 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table9 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE) UNION ALL
SELECT $stuff FROM table10 WHERE MATCH (Name) AGAINST ('+john +smith' IN BOOLEAN MODE)

テーブルはMyISAMであり、colに全文索引がありますNameTable3は3000万以上のレコード(約10GB)を持っているものです。1つのテーブルに配置するか、分割すると、パフォーマンスが大幅に向上しますか?私は何か他のものが欠けていますか?それとも、全文検索で迅速に応答するために、6000万件以上のレコードが大きいのでしょうか。

4

1 に答える 1

0

最初に小さなメモ。「試してみてください」以外に本当の答えはありません。そうは言っても、

常にすべてのテーブルにクエリを実行していて、主に読み取りを行う場合は、1 つの大きなテーブルを使用する方が高速であると確信しています。

ユニオン (またはすべてをユニオン) を使用すると、常に個々の結果が一時テーブルに配置され、そのテーブルが十分に大きい場合は、ディスク上に作成されます。大きなテーブルが 1 つある場合は、結果をクライアントに直接返すことができます。

大量の挿入を行う場合は、それらを小さなテーブルに配置すると高速になります (トラバースするインデックスが小さいため.

ただし、どのテーブルが結果を返す可能性があるかを判断し、それらをクエリで使用するだけで、多くの分割を得ることができます。これはパーティショニングでも可能です

また、アプリケーションにクエリを配置して並列に実行し、MySQL の外部で結合を行うことができれば、ある程度のパフォーマンスが向上する可能性がありますが、実際に知るには試して測定する必要があります。

于 2013-01-10T21:47:20.550 に答える