Mysql 使用myisam从属/ghost表在innodb中进行全文搜索

Mysql 使用myisam从属/ghost表在innodb中进行全文搜索,mysql,indexing,innodb,myisam,Mysql,Indexing,Innodb,Myisam,我需要在两个不同的表中对两个不同的列进行全文索引 唯一的问题是我使用的是innodb,没有办法做全文索引 我知道有像斯芬克斯这样的选项,我看了一下这些选项,但我觉得这太过分了,因为要全文索引的列是varchar(20) 而且,“最多”大概只有大约1000000行 我想到的一个简单的选择是,仅使用要使用myisam索引的主键和varchar复制这两个表 有什么建议吗?有什么方法可以轻松做到这一点吗?您的方法似乎是正确的 创建一个新表,其中只包含感兴趣的字段(感兴趣的pkey和varchar)、引

我需要在两个不同的表中对两个不同的列进行全文索引

唯一的问题是我使用的是innodb,没有办法做全文索引

我知道有像斯芬克斯这样的选项,我看了一下这些选项,但我觉得这太过分了,因为要全文索引的列是varchar(20)

而且,“最多”大概只有大约1000000行

我想到的一个简单的选择是,仅使用要使用myisam索引的主键和varchar复制这两个表


有什么建议吗?有什么方法可以轻松做到这一点吗?

您的方法似乎是正确的

  • 创建一个新表,其中只包含感兴趣的字段(感兴趣的pkey和varchar)、引擎myisam

  • 根据需要在此新表上创建全文索引

主要的转变是使这个新表与主表保持同步。最好的方法是使用主表的插入、更新和删除


另一个技巧是防止最终用户篡改全文索引表。这也可以通过触发器实现,但有一种更好的方法:创建一个db用户(例如tg_用户),并授予他该表的所有权。然后将除select之外的所有内容撤消给其他用户。并确保在创建上述触发器时使用
definer
子句。

我决定使用一个简单的解决方案:

首先,将该行插入innodb表(master)。然后,在它之后,将该行插入myisam表(而不是触发器)

每小时运行一次cron以确保引用完整性

查询内容如下:

SELECT * 
FROM master 
WHERE master.ID NOT IN 
    (SELECT slave.ID FROM slave WHERE master.ID=slave.ID);

SELECT * 
FROM slave 
WHERE slave.ID NOT IN 
    (SELECT master.ID FROM master WHERE slave.ID=master.ID);
如果从属行引用不存在的主行,请删除

如果主行的从属行不存在,请插入


这不是最好的解决方案,但很简单。

反规范化,将文本数据放在MyISAM表中,并将其链接到InnoDB表(尽管MyISAM不会强制执行引用完整性)…第一个问题很好,对它带来的答案很好奇&欢迎使用stackoverflow。嘿,谢谢。尽管反规范化看起来很简单,但我担心的一件事是引用完整性,正如OMG所指出的:没有事务或f键来确保存储在myisam表中的行是正常的,以防止搜索结果引用不存在的行或相反。感谢安全提示。没有想到要隔离从属表。