列articles
、content
および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)
説明
この最初のクエリは複数列クエリです。
この2番目は、3つの列を個別に実行してからそれらを結合する新しいはるかに高速なクエリです(クエリキャッシュがクリアされました)。
全文列の順序
説明付きのインデックスの使用/強制
あなたの質問の投稿から、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インデックスを作成することを提案しました
Mar 16, 2012
: 複数列にわたる検索を高速化Oct 13, 2012
: フルテキストパーサープラグインなしでWordスプリッターとしてアンダースコアを強制できますか?