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