挨拶!
次の問題があります。膨大な数の行を含むテーブルがあり、検索してから、検索結果を多くのパラメーターでグループ化する必要があります。テーブルが
id, big_text, price, country, field1, field2, ..., fieldX
そして、このようなリクエストを実行します
SELECT .... WHERE
[use FULLTEXT index to MATCH() big_text] AND
[use some random clauses that anyway render indexes useless,
like: country IN (1,2,65,69) and price<100]
これは検索結果として表示されます。次に、これらの検索結果を取得し、いくつかのフィールドでグループ化して、検索フィルターを生成する必要があります。
(results) GROUP BY field1
(results) GROUP BY field2
(results) GROUP BY field3
(results) GROUP BY field4
これは私が必要としているものの単純化されたケースです。手元にある実際のタスクはさらに問題があります。たとえば、最初の結果クエリが独自のGROUPBYも実行する場合があります。そして、そのような機能の例は、このサイト http://www.indeed.com/q-sales-jobs.html (検索結果と左側のフィルター)です。
私はMySQLがどのように機能するかについて深く研究してきましたが、現時点では、MySQLでこれが可能であるとはまったく考えていません。大まかに言えば、MySQLテーブルはHDD上にある行のヒープにすぎず、インデックスはこれらのテーブルの小さなバージョンであり、インデックスフィールドでソートされ、実際の行を指します。もちろん、これは非常に単純化されていますが、要点は、これを修正する方法、つまり、複数のインデックスを使用して、高速のGROUP BYを実行できる方法がわかりません(クエリがGROUPに到達するまでに) BYインデックスは、範囲検索などのためにまったく役に立ちません)。MySQL(または同様のデータベース)には、インデックスのマージ、緩いインデックススキャンなど、さまざまな便利な機能があることを知っていますが、これは単に適切ではありません。上記のクエリの実行には、それでも永遠に時間がかかります。
この問題は、集計タスクなど、データを保存および処理するための根本的に新しい方法を利用するNoSQLによって解決できると言われました。私が知りたいのは、これがどのように行われるかについての簡単な概略説明です。つまり、それがどのように可能であるかが今のところ理解できないので、それが実際にそれを行っていることを実際に確認できるように、それをざっと見たいだけです。つまり、データはまだデータであり、メモリに配置する必要があり、インデックスはすべての制限があるインデックスです。これが実際に可能であれば、NoSQLの詳細な調査を開始します。
PS。NoSQLに関する大きな本を読みに行くように言わないでください。私はすでにMySQLに対してこれを行っていますが、私の場合は使用できないことがわかりました:)ですから、大きな本を手に入れる前に、テクノロジーについて予備的な理解をしたかったのです。
ありがとう!