0

フルテキスト インデックスを使用してコンテンツ (テキスト) フィールドを検索する、MySQL と PHP で構築されたカスタム CMS のコードベースを継承しました。データベース構造を分析すると、関連するすべてのテーブルが次の方法で作成されていることがわかりました (簡略化された例)。

CREATE TABLE `stories` (
  `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `headline` varchar(255) NOT NULL DEFAULT '',
  `subhead` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`story_id`),
  FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`),
  FULLTEXT KEY `headline` (`headline`),
  FULLTEXT KEY `subhead` (`subhead`),
  FULLTEXT KEY `content` (`content`)  
) ENGINE=MyISAM;

ご覧のとおり、フルテキスト インデックスは通常の方法で作成されますが、各列も個別に追加されるため、2 つの異なるインデックスが作成されると思います。

以前の開発者に連絡したところ、これがフルテキスト インデックスを作成する「適切な」方法であるとのことですが、インターネットで見つけたすべての例によると、そのような要件はなく、これで十分です。

CREATE TABLE `stories` (
  `story_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `headline` varchar(255) NOT NULL DEFAULT '',
  `subhead` varchar(255) DEFAULT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`story_id`),
  FULLTEXT KEY `fulltext_search` (`headline`,`subhead`,`content`)
) ENGINE=MyISAM;

テーブルには 80,000 を超える行があり、管理がますます難しくなっている (完全なデータベースは 10 GB に近い) ため、不要なデータを削除したいと考えています。

よろしくお願いします。

4

1 に答える 1

0

自分でそれを理解する方法は、クエリ (一致) で EXPLAIN を使用して、実際に使用されているインデックスを確認することです。インデックスを使用せず遅いクエリがある場合は、インデックスを作成して (または手動で index_hint を使用するように指示して)、EXPLAIN をもう一度試して、インデックスが使用されるかどうかを確認します。

ユーザーが検索する列を 1 つだけ指定することが許可されていて、その列がインデックス付き列のリストの最初または唯一のものではない場合、クエリ/一致ではインデックスなしの順次検索が使用されると思います。言い換えれば、インデックスが ( headline, subhead, content) の場合、インデックスは 3 つの列すべて、またはheadline, またはheadlineandのみの検索に使用されますsubheadが、サブヘッドだけではなく、コンテンツだけではありません。しばらくやっていないので、最近は何かが違うかもしれません。しかし、EXPLAIN は何が起こっているかを明らかにする必要があります。

EXPLAIN を使用して考えられるすべてのクエリを調べて、いずれのクエリでもインデックスが使用されていないことがわかった場合、インデックスは必要ありません。

于 2013-05-25T15:35:15.753 に答える