今天就跟大家聊聊有關什么是MYSQL的開發思路,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
昨天運維的親,來找我,要統計一個事情,具體的情況是這樣,要判斷某臺機器中的的 priority 為 1 的數據在 900秒內,并且計數,如果這樣的情況超過1 條,則報警, 并且還有一個情況,就算900秒內 priority的等于1 的只有1條,但priority 可能為 2 3 4 5 6 的只要有任意一條,就報警。
下面就是這樣的一個語句,寫的是沒有問題的,這位同學之前是ORACLE 的DBA。問我有什么好的方法來改善目前數據查詢性能不好的情況。
SELECT
s.DeviceReportedTime, #統計報告時間
s.Priority, #優先級,有6種,均是數字1-6
s.FromHost, #主機IP
s.Message #告警信息
FROM
SystemEvents s #假設有五千萬數據,時間有索引
WHERE
s.FromHost = '10.50.131.1'
AND s.Priority = 1
AND s.DeviceReportedTime > DATE_SUB(NOW(), INTERVAL 900 SECOND)
AND EXISTS (
SELECT
1
FROM
SystemEvents se
WHERE
se.DeviceReportedTime > DATE_SUB(NOW(), INTERVAL 900 SECOND)
AND se.FromHost = '10.50.131.1'
HAVING
COUNT(1) >= 2
);
首先我們從邏輯上來,MYSQL 的從來都是要將復雜的事情,變得簡單。
上面的報警邏輯只有兩個總結
1 priority =1 的時候記錄超過1條
2 priority = 1 的時候還有其他priority 的記錄并行存在的情況也報警
簡單用SQL 來表達就是
1 select count (*) from table where priority =1 (count(*) > 2)
2 select count(*) from table where priority <> 1 + select count(*) from table where priority = 1 > 1
以上兩種情況就會報警
如果通過SQL SERVER ORACLE PG 那用上面的語句類型來處理,是非常好的解決方法。
但MYSQL 則不是,MYSQL 編程或者提取數據的方式都是要 短 小 快的方式,這比較符合MYSQL的 數據庫使用的場景。
因為是要在ZABBIX 中進行計算,最終給出的方案為
1 將上面的SQL 拆分
在ZABBIX 報警由一條 變為兩條
報警
select count (*) from table where
FromHost = '10.50.131.1'
AND Priority = 1
AND DeviceReportedTime > DATE_SUB(NOW(), INTERVAL 900)
select count(*) from table
where
FromHost = '10.50.131.1'
AND Priority <> 1
AND DeviceReportedTime > DATE_SUB(NOW(), INTERVAL 900)
在通過腳本,判斷 兩條語句如果 語句1 > 1 報警
語句 1 在 = 1 情況下 語句2 >1 就報警
語句1 = 0 則不報警
將上面的復雜的SQL 變為語句 + 腳本的方式來處理
這也是 MYSQL 在使用中的一個思路,千萬別把MYSQL 當 ORALCE 時候用 ,任何的 長SQL 都往上堆,那絕對是在給未來 找 麻煩。
看完上述內容,你們對什么是MYSQL的開發思路有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。