2012-02-10 70 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。