1. 程式人生 > 其它 >用ELK分析每天4億多條騰訊雲MySQL審計日誌(4)--MySQL全文索引

用ELK分析每天4億多條騰訊雲MySQL審計日誌(4)--MySQL全文索引

前言:

該文章將會介紹以下:

1,MySQL全文索引的使用

2,全文索引STOPWORD

3,使用全文索引的高效和準確

最近事情比較少,剛好可以梳理一下以前的工作,做一下總結!

在以前的解決方案中有介紹百萬級如何使用MySQL全文索引方法,在沒使用ELK前,線上13個例項的SQL日誌都是手工匯入的MySQL的innodb表中,

建立全文索引來分析的。

分析的SQL如下: 布林文字搜尋(IN BOOLEAN MODE ):條件要全滿足

SELECT count(*) 呼叫次數,user 賬號,'crm1' 例項,'tab' 表名,'select
' 操作,`sql` 樣例SQL FROM cc WHERE
MATCH(`sql`) AGAINST('+tab +select' IN BOOLEAN MODE) group by user

因為13個例項資料量超過4億,將這13個日誌分成多個表, 如果錶行數特別大會報錯,需要調整引數innodb_ft_cache_size到最大值。

同時查詢出的結果會有少量的錯誤:

這裡的操作是select語句,但實際是insert,因為insert語句裡包含有:select這個關鍵字,也被統計到。但如果如下查詢有:

MATCH(`sql`) AGAINST('+tab +select -from -for
' IN BOOLEAN MODE)

這裡的:-from -for 是無法生效的,因為from和for屬於全文索引STOPWORD:

SELECT * FROM information_schema.INNODB_FT_DEFAULT_STOPWORD;

如何解決這些少量的錯誤,想了一下,保持字首的方式來判斷,以字首的操作為主:

SELECT count(*) 呼叫次數,user 賬號,'crm1' 例項,'tab' 表名,'select' 操作,`sql` 樣例SQL FROM cc WHERE 
MATCH(`sql`) AGAINST('+tab +select' IN BOOLEAN MODE
) and `sql` like concat('select','%') group by user

該SQL的確能準確排除掉干擾,但是執行效率太慢了,以前幾個小時能分析完的,使用該方法需要幾十小時,一旦報錯,又要幾十小時,無法保證能分析完成

有沒有其他辦法,即能準確又高效?

想了想,既然2個都只滿足其中一部分,不如2者結合起來使用, 怎麼結合:

方案1直接分析不變,分析完結果後,對結果表:ea_tj 再進行分析:

select * from ea_tj where sqltext not like concat(op,'%') 

查出這些異常的結果,對這些少量異常結果再進行:`sql` like concat('select','%')分析:

這樣就解決 :準確和高效

MySQL全文索引方法分析,比資料放到ELK再分析有巨大效能差距。