我們就說下這個例子,提醒廣大開發在寫SQL的時候必定要仔細!
當時狀況是這樣的,一個慢SQL把數據庫CPU鏈接數跑滿,因爲併發壓力大,CPU空閒瞬時爲0,過一會機器被HANG死,鏈接不上。
因涉及公司隱私問題,我這裏用測試表代替,我們主要看看是怎麼引發的。 mysql
表結構: sql
1 數據庫 2 併發 3 測試 4 spa 5 3d 6 blog 7 索引 8 開發 9 10 |
mysql> desc sbtest; +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | 0 | | | k | int(10) unsigned | NO | MUL | 0 | | | c | char(120) | NO | | | | | pad | char(60) | NO | | | | +-------+------------------+------+-----+---------+-------+ 4 rows in set (0.22 sec) |
如今開始了,開發寫了這麼一條SQL語句:
1 |
select * from sbtest where id in ('1','2','111111111111'); |
(注:11個1)
各位,大家以爲這條SQL有問題嗎?很簡單,開發也認爲這麼簡單的SQL不用給DBA去審覈,但每每陰溝裏翻船,死在了自認爲簡單的SQL裏,那麼咱們執行一下,看看執行計劃。
id是主鍵,卻沒有用到索引,全表掃描。這是爲毛?
溢出了。int最大寬度是11位,而我剛纔輸入了11個1,溢出了,若是換成10個1,再來看看效果。
已經用到索引,只需掃描3行就出結果。
下面再看看這兩條SQL的執行時間:
插入11個1,耗時4.39秒
插入10個1,耗時0.10秒
結論:
爲了不這種問題的出現,int數值整形不要加''引號,若是是varchar字符串類型,要加上''引號。
血的教訓!請各位開發注意!數據庫是業務的核心,不能想固然,本身寫的痛快就直接跑現網,形成的損失是極大的。