2012-02-10 71 views
1

我正在使用Nagios插件来监视我们的rsyslog服务器,该服务器后端连接到MySQL数据库。该插件通过生成一个唯一的字符串,将其发送到syslog,然后查询MySQL数据库中的唯一字符串来操作,从而证明该服务正确地接收和存储消息。在MySQL LongText字段中搜索字符串的'正确'方法?

这个表是,不出所料,大(〜350万行,磁盘上2.1GB)和InnoDB格式。持有系统日志消息的列是LONGTEXT类型。

我目前在发送查询的形式为:

SELECT count(*) FROM allremote WHERE message LIKE '%check_rsyslogdb_1328869942%'; 

如果在这种情况下check_rsyslogdb_1328869942是由插件记录唯一的字符串。

有没有更有效的方法让我接近这个查询?

我查看了FULLTEXT索引,但它们只是MyISAM,并且作为一项我们避免使用MyISAM的策略,因为它显然较差。

+2

http://stackoverflow.com/questions/1381186/fulltext-search-with-innodb – 2012-02-10 12:01:22

+0

'select 1 from ...... limit 1' would help a bit。而不是计算所有匹配的行,我们只找到一个匹配,然后返回1.如果没有返回结果,则表示没有找到结果。 – diolemo 2012-02-10 13:27:53

+0

如果你有一个唯一的ID(auto_increment),那么你可以检查自上次检查以来的行。因此,如果您上次有ID 5000,只需在字符串匹配条件之前添加条件以确保ID> 5000即可。 – diolemo 2012-02-10 13:29:58

回答

0

事实证明,因为我使用MySQL 5. *我不需要使用LONGTEXT,我可以使用VARCHAR(2048)代替。这让我创建一个正常的索引,并且由于我知道确切的消息,只要我在末尾添加了一个额外的尾部空间(不确定这是从哪里来的),我可以忽略%s。