質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

7218閲覧

[MySQL]大量データのフリーワード検索を高速に行いたい

shunshun

総合スコア89

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

2クリップ

投稿2015/06/11 15:26

お世話になります。

php・MySQL(5.6)を使用してWEBアプリケーションを作成しております。
現在、フリーワード検索を実装中なのですが、高速にデータを検索することができず困っております。
皆様のお知恵をお貸し下さい。

要件は、「1秒以内に約100万件のデータに対してフリーワード検索を行い、取得結果をソートして表示する」です。
この要件を満たす為に、下記のような検索用テーブルを作成しました。


id | point1 | point2 | freeword

PRIMARYKEY -- id
INDEX -- point1, point2 (複合index)
FULL TEXT INDEX -- freeword

エンジン MyISAM

LIKE句を使用した場合、速度がでないと聞きましたのでfull_text_searchを採用しました。
freewordには、『名前』をBIGRAM、UNIGRAM化したものを入れています。

このテーブルに対して、下記のようなSQL文を流しています。
SELECT SQL_CALC_FOUND_ROWS
id
FROM table
WHERE
MATCH(freeword ) AGAINST('+"あい" +"いう"' IN BOOLEAN MODE)
ORDER BY
point1 DESC
,point2 DESC

EXPLAINの結果をみつつ、自己結合してみたりサブクエリを流してみたりチューニングを試みておりますが、どうしても取得結果をORDER BYすることによるソート処理で時間がかかっているようです。

FULL TEXT INDEXとINDEXの2つのINDEXを効かせることで高速に検索できるようになりませんでしょうか。

分かる方がいらっしゃいましたらご回答をお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

MySQLなどのDBでは限界があると思います。
DBで100万件処理するときは必ずパフォーマンスが問題なる。と考えるようにしています。

例えば、1件1ミリセック(0.001秒)で処理したとしても、
100万件処理するなら1,000秒(16分)かかることになります。(ありえないですね)

Like検索などは、特に遅くなるのでDBは利用しません。

フリーワード検索が必須ならば、Solrなどを検討してみてはいかがでしょうか?

投稿2015/06/11 15:48

kurosawa

総合スコア780

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunshun

2015/06/15 15:03

ご回答ありがとうございました。 今回は自己解決に至りましたが、 次回同じような状況に陥った場合は、Solrやmroongaなどのエンジンの導入も検討したいと思います。 ありがとうございました。
guest

0

自己解決

自己解決しましたので、解決に至った経緯について報告します。

エンジンをInnoDBに変更した以外、環境やテーブルの設定に関しては変えておりません。
当方の環境下では、
FULL TEXT INDEXは、結果レコードが多い場合は(20万件以上)検索結果の取得に時間がかかり、結果レコードが少ない場合は1秒未満でかえってくるような状態でした。
また、FULL TEXT INDEXのはったカラムにLIKE句を使用して検索した場合(検索時のキーワードはNgram化したもの)、その逆の結果が得られました。(結果レコードの多いものに関してははやいが少ないものに関しては遅い)

そこで、検索結果が多くなると考えられる検索キーワードはLIKE句のクエリを発行し、
逆に検索結果が少なくなると考えられる検索キーワードにはFULL TEXT INDEXの検索方法を用いました。

投稿2015/06/15 15:00

shunshun

総合スコア89

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問