Mysql
在 MySQL 中通過許多表進行全文搜尋
我們有高流量的新聞網站,我想添加一個功能,每個使用者都可以搜尋網站的所有內容,例如
news
,polls
,comments
,galleries
等。每種內容類型都有自己的表格。我決定創建一個包含所有類型的所有內容的表:
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
,上述表格之間是獨一無二的。當插入每種類型的新內容時,我也應該INSERT
將其放入full_text_search
表格中。問題
- 對於一天的許多插入(所有類型大約 3000 個),這是一個好的解決方案還是反模式?
- 如果我將此表與其他表分開並將其放入任何其他數據庫(例如其他 RDBMS 或 NoSQL)中,這是更好的選擇嗎?
- 還有其他解決方案嗎?
當然,可以將可搜尋的內容複製到您的 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)中創建全文搜尋索引。但同樣的模式也很有用——儲存主鍵欄位和內容類型的欄位。