用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再分析有巨大效能差距。