0

私は巨大な人物データベースを持っており、その名前で一般的な検索を行っています。

SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%Jack%';
SELECT * FROM tbl_person WHERE full_name LIKE 'Sparow%';

このテーブルに新しいデータを挿入することはめったにありません。

一般的な last_name クエリを hark ディスクに保存したいのですが、クエリは既に RAM に保存されていますが、サーバーを再起動するたびに失われます。

私のテーブルには 17 億の行があり、各行 (インデックス付き) は 1k かかります。はい、1.7Tb のデータベースです。

これが、共通選択をディスクに保存したい主な理由です。

Variable_name,Value
query_alloc_block_size,8192
query_cache_limit,1048576
query_cache_min_res_unit,1024
query_cache_size,4294966272
query_cache_type,ON
query_cache_wlock_invalidate,OFF
query_prealloc_size,8192

編集 :

SELECT * FROM tbl_person WHERE full_name LIKE 'Savard%';

最初の実行に 1000 秒、その後 2 秒かかります。システムを再起動して再度実行すると、クエリに再び 1000 秒かかります。

再起動する前に、既に行っているのと同じクエリを実行するのに mysql がさらに 1000 秒かかるのを避けたいだけです。

4

2 に答える 2

0

データに対してこのようなクエリを多数実行している場合は、Apache LuceneまたはSphinxを使用してテーブルのインデックスを作成することをお勧めします。データベースは高速ですが、何百万もの行で部分一致を実行する場合は効率的ではありません (特に MySQL)。

私はすでにZend Framework と Lucene に関する同様の質問に答えており、PHP 環境でセットアップして使用するのが最も簡単であると信じているため、Zend のソリューションを支持しています。

幸いなことに、Zend Framework はモジュール単位で使用できるため、クラス ライブラリ全体を使用せずにZend Search Lucene モジュールのみを簡単に使用できます。

** 編集 **

インデクサーの役割は、DB を置き換えることではなく、部分検索を実行する方法を提供することで検索機能を向上させることです。たとえば、特定のテーブルで、いくつかのフィールドのみにインデックスを付け (それらを「クエリ可能」にする)、データベース内の行を参照する他の静的 (インデックスなし) フィールドを持つことができます。

インデクサーを使用する利点は、データベースにクエリを実行する代わりに、事前計算にインデックスを付けて直接検索できることです。

于 2013-09-05T14:25:08.803 に答える