工做中MySql的瞭解到的小技巧

工做中MySql的小技巧

1. 跑腳本時,常常遇到有則更新無插入的 邏輯操做;一般狀況下,來一波if()判斷而後選擇 更新仍是插入,前兩天逛論壇時發現有人在比較REPLACE INTO 和 INSET INTO *** ON DUPLICATE KEY UPDATE ** 的 效率,以爲這是一個是優化之前作法的知識,有點意思。
  • REPLACE INTO 與 INSET INTO *** ON DUPLICATE KEY UPDATE ** 的使用與比較

先建立一個實驗表html

CREATE TABLE gmm_test (
  id INT AUTO_INCREMENT PRIMARY KEY,
  `unqi` INT,
  field1 INT,
  field2 VARCHAR(12),
  UNIQUE KEY (unqi)
) ;

這張表裏面,id自增,unqi是惟一索引。
同時咱們添加一條記錄:
mysql

INSERT INTO `gmm_test` (`unqi`,`field1`,`field2`) VALUES (2,2,'ddd');

表裏面是這樣的:sql

id    unqi  field1  field2  

 1       2       2  ddd

當咱們想以unqi爲條件來一波--有更無增(指符合條件的記錄執行更新,不符合的則插入新紀錄,下同) 操做時;markdown

以下便可:函數

REPLACE INTO `gmm_test` (`unqi`,`field2`) VALUES (2, 'qqqq')

執行後,有以下結果:
1 queries executed, 1 success, 0 errors, 0 warnings優化

查詢:replace into `gmm_test` (`unqi`,`field2`) values (2, 'qqq')

共 2 行受到影響

執行耗時   : 0.003 sec
傳送時間   : 0.003 sec
總耗時  : 0.006 sec

這時你應該注意到,共2行受到影響ui

看下錶的結果,code

id    unqi  field1  field2  

 2       2  (NULL)  qqqq

連主鍵id都自增了一次,因此在使用時要注意了,畢竟id變了可不是小事~~htm

再來看看 INSET INTO * ON DUPLICATE KEY UPDATE , 這個也能夠來 ---有更無增;blog

INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10;

或者
INSERT INTO gmm_test (unqi, field1, field2) VALUES (2, 10, 'qqqq') ON DUPLICATE KEY UPDATE field1 = values(field1);

結果以下:

查詢:INSERT INTO `gmm_test` (`unqi`, `field1`, `field2`) VALUES (2, 0, 'qqqq') ON DUPLICATE KEY UPDATE field1 = field1 + 10

共 2 行受到影響

執行耗時   : 0.002 sec
傳送時間   : 0.001 sec
總耗時  : 0.003 sec

雖然也是兩行,可是主鍵id並無變,

id    unqi  field1  field2  
 2       2      10  qqqq

關於效率問題,木有測,就借網上別人測好了的吧 .這裏

總結下來,就是儘可能仍是不用replace into 吧,畢竟好多坑

2. 我在統計我爬蟲抓取到的一些內容的時候,又一次須要一個 堆疊的條形圖,至關於將一個字段的值按區間來分組。

好比我要統計 在線時間 分別 在 0~50h,50~100h,100~200h,200~500h ,200h以上 內的人數分別有多少?

SELECT ELT(INTERVAL(h.online_time,0, 50,100, 200), '0','50','100', '200') AS on_time, COUNT(h.online_time) AS cnt
 FROM hupu_user h
 GROUP BY ELT(INTERVAL(h.online_time, 0, 50,100, 200), '0','50','100', '200');

解釋:

INTERVAL(N,N1,N2,N3,..........)

INTERVAL()函數進行比較列表(N1,N2,N3等等)中的N值。該函數若是N<N1返回0,若是N<N2返回1,若是N<N3返回2 等等。若是N爲NULL,它將返回-1。列表值必須是N1<N2<N3的形式才能正常工做。

eg:
假設有一個下載速度表(有 speed 和 count 兩個字段),
而後統計1M,2M,4M,8M,8M以上這個5個速度區間的個數

select INTERVAL(speed,1000,2000,4000,8000) as i_s, sum(count)  from a_speed_table  group by i_s

上面的 sql 根據速度區間分組,再對不一樣區間出現的次數求和

ELT(N,str1,str2,str3,...)

若是N =1返回str1,若是N= 2返回str2,等等。返回NULL若是參數的數量小於1或大於N。ELT()是FIELD()的補集。 這個比較好理解了

3. order by 排序重複的問題。

當order by 後面值相同時,系統對數據的排序可能變得隨機化,即一下子這條數據在前面,一下子這條數據在後面了 ,因此咱們看到了重複數據,因此在分頁的時候使用oerder by的時候最後在目標排序字段的基礎上再加上一個字段,組成一個不會相同的排序依據

···這些也不算難,權當些無聊時的獲取些筆記樂趣吧,而後想吐槽下博客園對markdown格式支持仍是有些不同額,和預期的排版差一些~~||0,0||···

做者:fredGui

*來源:http://www.cnblogs.com/guixiaoming/p/8672343.html

著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。

相關文章
相關標籤/搜索