您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)什么是MYSQL的開(kāi)發(fā)思路,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
昨天運(yùn)維的親,來(lái)找我,要統(tǒng)計(jì)一個(gè)事情,具體的情況是這樣,要判斷某臺(tái)機(jī)器中的的 priority 為 1 的數(shù)據(jù)在 900秒內(nèi),并且計(jì)數(shù),如果這樣的情況超過(guò)1 條,則報(bào)警, 并且還有一個(gè)情況,就算900秒內(nèi) priority的等于1 的只有1條,但priority 可能為 2 3 4 5 6 的只要有任意一條,就報(bào)警。
下面就是這樣的一個(gè)語(yǔ)句,寫的是沒(méi)有問(wèn)題的,這位同學(xué)之前是ORACLE 的DBA。問(wèn)我有什么好的方法來(lái)改善目前數(shù)據(jù)查詢性能不好的情況。
SELECT
s.DeviceReportedTime, #統(tǒng)計(jì)報(bào)告時(shí)間
s.Priority, #優(yōu)先級(jí),有6種,均是數(shù)字1-6
s.FromHost, #主機(jī)IP
s.Message #告警信息
FROM
SystemEvents s #假設(shè)有五千萬(wàn)數(shù)據(jù),時(shí)間有索引
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
);
首先我們從邏輯上來(lái),MYSQL 的從來(lái)都是要將復(fù)雜的事情,變得簡(jiǎn)單。
上面的報(bào)警邏輯只有兩個(gè)總結(jié)
1 priority =1 的時(shí)候記錄超過(guò)1條
2 priority = 1 的時(shí)候還有其他priority 的記錄并行存在的情況也報(bào)警
簡(jiǎn)單用SQL 來(lái)表達(dá)就是
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
以上兩種情況就會(huì)報(bào)警
如果通過(guò)SQL SERVER ORACLE PG 那用上面的語(yǔ)句類型來(lái)處理,是非常好的解決方法。
但MYSQL 則不是,MYSQL 編程或者提取數(shù)據(jù)的方式都是要 短 小 快的方式,這比較符合MYSQL的 數(shù)據(jù)庫(kù)使用的場(chǎng)景。
因?yàn)槭且赯ABBIX 中進(jìn)行計(jì)算,最終給出的方案為
1 將上面的SQL 拆分
在ZABBIX 報(bào)警由一條 變?yōu)閮蓷l
報(bào)警
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)
在通過(guò)腳本,判斷 兩條語(yǔ)句如果 語(yǔ)句1 > 1 報(bào)警
語(yǔ)句 1 在 = 1 情況下 語(yǔ)句2 >1 就報(bào)警
語(yǔ)句1 = 0 則不報(bào)警
將上面的復(fù)雜的SQL 變?yōu)檎Z(yǔ)句 + 腳本的方式來(lái)處理
這也是 MYSQL 在使用中的一個(gè)思路,千萬(wàn)別把MYSQL 當(dāng) ORALCE 時(shí)候用 ,任何的 長(zhǎng)SQL 都往上堆,那絕對(duì)是在給未來(lái) 找 麻煩。
看完上述內(nèi)容,你們對(duì)什么是MYSQL的開(kāi)發(fā)思路有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。