溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

什么是MYSQL的開(kāi)發(fā)思路

發(fā)布時(shí)間:2021-10-25 10:33:21 來(lái)源:億速云 閱讀:95 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(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è)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI