2

巨大な mysql データベース (50 億レコード) のインデックスを作成する必要があります。めったに作成、更新、または削除しません

SELECT * FROM tbl_person WHERE name LIKE 'foo%' のような一部のリクエストのみ

私はすでにフィールドにインデックスを設定しています。

1 つを使用すると、読み取り要求で最高のパフォーマンスが得られます

50 億レコードのテーブルで 1 回のリクエスト、または 5 億レコードのテーブルで 10 回のリクエストとその後の結合結果。

4

2 に答える 2

8

できることはたくさんあります。まず、個人名で定期的に検索する場合は、個人名の最初または最初の数文字でテーブルを分割することを検討してください。パーティショニング タイプを参照してください。

たとえば、整数は検索がはるかに高速であるため、名前の最初の 2 文字または 3 文字を表すsmallintであるname_abbrというフィールドを作成できます。このフィールドをインデックス化して分割します。したがって、aaaは 1、aabは 2 などになります。クエリは次のようになります。

SELECT * FROM Table WHERE name_abbr=123 AND name LIKE 'foo%';

これで正しいパーティションにヒットし、LIKE ははるかに小さなレコード セットをチェックするだけで済みます。

できることは他にもたくさんありますが、大規模なデータ セットでは、データをグループに分割し、可能な限り常にクエリに整数を使用することが常に最善であることを覚えておいてください。また、必ずEXPLAINキーワードを使用して、使用したいインデックスとパーティションがクエリで使用されていることを確認してください。

于 2013-05-16T18:09:05.813 に答える
2

インデックスを使用できないLIKE可能性があるため、そのサイズの MySQL データベースで句を使用して「良好な」パフォーマンスを得ることは決してありません。

そのような効率的なクエリが必要な場合は、別のストレージ設計を検討する必要があります。一般的な方法は、文字列の長さごとに個別のインデックス付きの列を作成することです。

例えば:

  1. フーバー
  2. フーバ
  3. フーブ
  4. ふー
  5. フォ

ウェアハウス内のデータを大幅に増やすことになりますが、これが適切なトレードオフであるかどうかは、要件によって示されます...スペースはパフォーマンスよりも安いですか? あなただけが答えを知っています。

編集:今、あなたの質問の2番目の部分を見ました。5b レコードに対して 1 つのクエリを実行するのが望ましいか、500m レコードに対して 10 回のクエリを実行するのが望ましいかを尋ねUNION、その結果....

クエリを分岐するための効果的なシャーディング システムがない限り、単一のクエリでより良い結果が得られることはほぼ確実であると言う傾向があります....既存のインフラストラクチャで検証するためにテストする必要があります。 .

于 2013-05-16T17:49:54.923 に答える