最近在工作中遇到乙個mysql update的嚴重效能問題,語句大概是這樣的:
update t_user set fstate=0 where fuid in (11111, 22222, ...., .....)in後的括號中,有1000個fuid的樣子
表結構如下:
儲存引擎是innodb, 版本是mysql 4.0.18
其中fuid是主鍵, 由於表資料量在300w左右,所以剛開始更新很慢,我以為是表資料量太大引起的效能問題,
起初一直在尋求優化mysql資料庫配置,結果都是浮雲,語句還是那麼的慢。
偶然期發現自己用的是varchar欄位型別,但卻在賦值時沒有加單引號:
對於varchar或者char欄位裡,如果只放數字型別的字串,可以不加單引號執行sql語句,不報錯:
例如:正常的寫法是:
select * from t_user where fuid='11111';但你可以寫這樣寫:
select * from t_user where fuid=11111;這條語句完全可以正常執行,但是表資料量很大的時候速度很慢。
但如果這樣寫:
select * from t_user where fuid=abcdef;sql執行時會報錯,於是用explain分析:
在未加單引號時:
加入單引號時:
執行計畫裡type說明了問題所在,不加單引號的會造成全表掃瞄,所以表資料量越大速度越慢,找出了問題所在,
給原來的update語句加上了單引號,在300w數量級的表中,速度快了200倍的樣子。
我在最新版本的mysql 5.1裡也實驗過,同樣有這個問題,百思不得其解,為什麼mysql在檢查到where後查詢條件
欄位是varchar,不強制限制賦值必須用單引號,字母的可以檢測到,但數字就不會。
如果有高人知道mysql為什麼這樣做的原因可以告訴我,小弟不勝感激 :)
mysql中反單引號 單引號 雙引號的區別
反引號,一般在esc鍵的下方。它是為了區分mysql的保留字與普通字元而引入的符號。舉個例子 select select from test where select 字段值 在test表中,有個select欄位,如果不用反引號,mysql將把select視為保留字而導致出錯,所以,有mysql保留...
MySQL中單引號 和反單引號 的作用
最近在做一些資料統計的工作,在執行mysql的時候,發現速度很慢。經過一番除錯,發現給資料加上單引號以後,速度變得非常快,於是自己在網上搜尋學習了一番,在此記錄一下。先看看sql select enum from template where type in user owner 在這個sql中,用...
乙個單引號引發的MYSQL效能損失
生活中難免遇到一些不如意,有些來自我們自身,而有些不是。今天冬至,說這一天是北半球白天最短 黑夜最長的。今天我們來分享下我的乙個同事提到加沒加單引號的巨大區別,對於mysql效能優化很有意義。剛剛我們說過了,生活中難免會有一些不如意,比如,我們用乙個字串型別的字段來作為主鍵,表面上,這太不如意了,然...