web-dev-qa-db-ja.com

MySQLの多くのテーブルの全文検索

トラフィックの高いNEWS Webサイトがあります。newspollscommentsgalleriesなど、すべてのユーザーがサイトのすべてのコンテンツを検索できる機能を追加したいと思います。コンテンツタイプごとに独自のテーブルがあります。

すべてのタイプのすべてのコンテンツを保持するテーブルを作成することにしました。

CREATE TABLE full_text_search
(
    master_id INT NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( master_id )
);

master_idテーブルの各content_textを識別するために、すべてのタイプのコンテンツごとにfull_text_searchとして一意の番号を生成します。

例えば:

News table:
+----+-------------+---------+---------+----------+------------+
| id | news_title  | lead    | subtitle|  content | master_id  |
+----+-------------+---------+---------+----------+------------+
|  1 |  sometitle  |some lead| subtitle|content 1 |     3      |
|  2 |  some title |some lead| subtitle|content 2 |     5      |
+----+-------------+---------+---------+----------+------------+

article table:
+----+-------------+---------+------------------+---------+------------+
| id | title       | author  | short description| content | master_id  |
+----+-------------+---------+------------------+---------+------------+
|  1 |  sometitle  | someone | very short desc  |content1 |     1      |
|  2 |  some title | otherone|  some short desc |content2 |     4      |
+----+-------------+---------+------------------+---------+------------+

ご覧のとおり、master_idは上記のテーブル間で一意です。各タイプの新しいコンテンツが挿入されると、full_text_searchテーブルにINSERTを挿入する必要があります。

質問

  • 1日の多くのインサート(すべてのタイプで約3000)の場合、それは良い解決策ですか、それともアンチパターンですか?
  • このテーブルを他のテーブルから分離し、他のRDBMSやNoSQLなどの他のDBに配置した方がよいでしょうか?
  • 他の解決策はありますか?
7
Arash Mousavi

もちろん、検索可能なコンテンツをfull_text_searchテーブルにコピーしても問題ありません。

MySQLはMyISAMストレージエンジンでのみFULLTEXTインデックスをサポートします(MySQL 5.6までは、MySQL 5.6のInnoDBのフルテキストはまだ少し不安定に見えます)。安全のために標準データをInnoDBに保存し、インデックス作成のためにMyISAMにコピーを保存できます。 MyISAMはデータ破損の影響を受けやすいですが、それがコピーだけの場合は、MyISAMテーブルが破損した場合にそれを再設定する必要があります。

各テーブルの主キーとは異なるmaster_idの使用は少し奇妙です。主キーを使用せず、コンテンツのタイプに応じてfull_text_searchテーブルに別の列を追加してみませんか?

CREATE TABLE full_text_search
(
    id INT NOT NULL,
    content_type ENUM('news','polls','comments','galleries','articles') NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( id, content_type )
);

full_text_search table:
+----+--------------+---------------+
| id | content_type | content_text  |
+----+--------------+---------------+
|  1 |         news |     ...       |
|  1 |     articles |     ...       |
|  2 |     articles |     ...       |
+----+--------------+---------------+

別のオプションは、Sphinx SearchやApache Solrなどの別の特殊なテクノロジーで全文検索インデックスを作成することです。しかし、同じパターンが役立ちます-主キーフィールドを格納しますandコンテンツのタイプのフィールド。

3
Bill Karwin