web-dev-qa-db-ja.com

複数列の全文検索が非常に遅くなる

articlescontentおよびtitleのテーブルkeywordsに全文索引があります

So select count(1) from articles where match(content,title,keywords) against ('cats' in boolean mode)のように、各列で検索を実行すると、結果は12〜15秒かかります。

ただし、列を個別に実行する場合(select count(1) from articles where match(content) against ('cats' in boolean mode))は、通常50ms未満かかります。

3つの列を検索すると、それらすべてを個別に検索するよりも100倍以上時間がかかるのはなぜですか?

これはどのように速くするかという問題ではなく、「なぜそんなに遅いのですか?」

テーブル/インデックス

id           int(30)       PK       auto_increment
url          varchar(1024)
title        varchar(255)  FULLTEXT
content      text          FULLTEXT
keywords     varchar(1024) FULLTEXT
comments     text
created_date int(11)
posted_date  int(11)

説明

この最初のクエリは複数列クエリです。

enter image description here

この2番目は、3つの列を個別に実行してからそれらを結合する新しいはるかに高速なクエリです(クエリキャッシュがクリアされました)。

enter image description here

全文列の順序

enter image description here

説明付きのインデックスの使用/強制

enter image description here

3
Jeremy Boyd

問題

あなたの質問の投稿から、3つのFULLTEXTインデックスが見つかりました。各列に1つあります。

クエリがまったく機能しないのはなぜですか? MySQLはそれが何であっても動作しました。あなたのケースでは、それは全表スキャンで検索しました。これは、MySQLクエリオプティマイザが決定したものです。

解決

本当に必要なのは、3つの列すべてを持つ単一のFULLTEXTインデックスです。

ALTER TABLE articles ADD FULLTEXT content_title_keywords_ndx (content,title,keywords);

そうしてはじめて

match(content,title,keywords) against ('cats' in boolean mode)

以前に複合FULLTEXTインデックスを作成することを提案しました

試してみる !!!

6
RolandoMySQLDBA