成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

美團面試:使用MySQL,你遇到過哪些坑?

數據庫 MySQL
本文技術面試題,是本人親身經歷的。所以,十年老兵告訴你,作為一枚后端開發人員,不管你們公司有沒有DBA,數據庫相關技術都是必備的。

[[420165]]

本文技術面試題,是本人親身經歷的。所以,十年老兵告訴你,作為一枚后端開發人員,不管你們公司有沒有DBA,數據庫相關技術都是必備的。

面試官:對于鎖這一塊,你還是掌握的蠻好的。

菜鳥我:(稍稍微笑,表示回應)

面試官:用了這么多年的MySQL,有哪些坑,讓你難以忘懷。

菜鳥我:巴拉巴拉 開始扯(這種面試題,我在面試前已經準備過了,所以,灑灑水啦)

下面,就根據自己的實戰經歷整理了一些數據庫開發的規范用法,用6個“避免”來概括。

1、避免在數據庫中做運算

有句話叫做“別讓腳趾頭想事情,那是腦瓜子的職責”,用在數據庫開發中,說的就是避免讓數據庫做她不擅長的事情。MySQL并不擅長數學運算和邏輯判斷,所以盡量不在數據庫做運算,復雜運算可以移到程序端CPU。

2、避免對索引列做運算

有次,有位同事讓我看一條SQL,說是在前臺查詢很快,但是把SQL取出來,在數據庫中執行的時候,跑10分鐘都不出結果??戳艘幌耂QL,最后定位到一個視圖中的一個子查詢上面。該子查詢的SQL文本如下:

  1. ## 以下SQL來源于網絡 
  2. SELECT  acinv_07.id_item , 
  3.         SUM(acinv_07.dec_endqty) dec_endqty 
  4. FROM    acinv_07 
  5. WHERE   acinv_07.fiscal_year * 100 + acinv_07.fiscal_period  
  6.         = ( SELECT DISTINCT 
  7.                    ctlm1101.fiscal_year * 100 + ctlm1101.fiscal_period 
  8.                    FROM ctlm1101 WHERE flag_curr = 'Y' 
  9.                    AND id_oprcode = 'acinv' 
  10.                    AND acinv_07.id_wh = ctlm1101.id_table) 
  11. GROUP BY acinv_07.id_item 

在acinv_07表上的列fiscal_year和列fiscal_period是有索引的。但是,如果對索引列進行運算,就會導致原本可以走索引的走不了索引。于是,動手改寫成如下SQL:

  1. ## 以下SQL來源于網絡 
  2. SELECT    id_item , 
  3.                     SUM(dec_qty) dec_qty 
  4.           FROM      dpurreq_03 
  5.           GROUP BY  id_item 
  6.         ) a , 
  7.         ( SELECT    a.id_item , 
  8.                     SUM(a.dec_endqty) dec_endqty 
  9.           FROM      acinv_07 a , 
  10.                     ( SELECT DISTINCT 
  11.                                 ctlm1101.fiscal_year , 
  12.                                 ctlm1101.fiscal_period , 
  13.                                 id_table 
  14.                       FROM      ctlm1101 
  15.                       WHERE     flag_curr = 'Y' 
  16.                                 AND id_oprcode = 'acinv' 
  17.                     ) b 
  18.           WHERE     a.fiscal_year = b.fiscal_year 
  19.                     AND a.fiscal_period = b.fiscal_period 
  20.                     AND a.id_wh = b.id_table 
  21.           GROUP BY  a.id_item 

再執行,4s鐘左右就可以跑出結果了。總的來說,寫SQL時,不到萬不得已,不要對索引列進行計算。

3、避免count(*)

在分頁查詢的時候,有的人總是習慣用select count()獲得總的記錄條數,實際上這不是一個高效的做法,因為,之前獲得數據的時候已經查詢過一次了,select count()相當于同一個語句查詢了兩次,對數據庫的開銷自然就大了,我們應當使用數據庫自帶的API,或者系統變量來完成這個工作。

4、避免使用NULL字段

大家在數據庫表字段設計的時候,應該盡量都加上NOT NULL DEFAULT'。使用NULL字段會產生很多不好的影響,例如:很難進行查詢優化、NULL列加索引,需要額外空間、含NULL復合索引無效…… 看下面的案例:

  1. 數據初始化: 
  2. create table table1 ( 
  3.     `id` INT (11) NOT NULL
  4.     `namevarchar(20) NOT NULL 
  5.  
  6.  
  7. create table table2 ( 
  8.     `id` INT (11) NOT NULL
  9.     `name`  varchar(20) 
  10.  
  11. insert into table1 values (4,"tianweichang"),(2,"zhangsan"),(3,"lisi"
  12. insert into table2 values (1,"tianweichang"),(2, null

(1) NOT IN子查詢在有NULL值的情況下返回永遠為空結果,查詢容易出錯

  1. select name from table1 where name not in (select name from table2 where id!=1) 

(2) 列值允許為空,索引不存儲null值,結果集中不會包含這些記錄。

  1. select * from table2 where name != 'tianweichang' 

  1. select * from table2 where name != 'zhaoyun1' 

(3) 使用concat拼接時,首先要對各個字段進行非null判斷,否則只要任何一個字段為空都會造成拼接的結果為null

  1. select concat("1"nullfrom dual; 

(4) 當計算count時候,name為null 的不會計入統計

  1. select count(namefrom table2; 

5、避免select

使用select *可能會返回不使用的列的數據。它在MySQL數據庫服務器和應用程序之間產生不必要的I/O磁盤和網絡流量。

如果明確指定列,則結果集更可預測并且更易于管理。想象一下,當您使用select *并且有人通過添加更多列來更改表格數據時,將會得到一個與預期不同的結果集。

使用select *可能會將敏感信息暴露給未經授權的用戶。

6、避免在數據庫里存圖片

圖片確實是可以存儲到數據庫里的,例如通過二進制流將圖片存到數據庫中。

但是,強烈不建議把圖片存儲到數據庫中!!!!首先對數據庫的讀/寫的速度永遠都趕不上文件系統處理的速度,其次數據庫備份變的巨大,越來越耗時間,最后對文件的訪問需要穿越你的應用層和數據庫層。

圖片是數據庫最大的殺手。一般來說數據庫都是存儲一個URL,然后再通過URL來調用圖片。

 

圖片,文件,二進制數這三樣東西慎重存儲到數據庫中。

 

責任編輯:武曉燕 來源: Java后端技術全棧
相關推薦

2025-05-28 00:00:01

MySQL場景索引

2017-07-14 09:29:45

AndroidWebview

2021-05-27 09:27:35

開發技能緩存

2020-10-12 09:49:14

C++ 開發代碼

2019-10-28 14:07:29

研發管理技術

2020-11-08 14:38:35

JavaScript代碼開發

2009-07-23 15:07:32

2011-04-26 09:22:05

SQLite

2023-03-13 07:41:34

分頁查詢數據排序

2019-12-05 08:44:20

MybatisSQL場景

2018-04-25 10:57:00

AIX報錯vios

2022-10-20 18:00:59

OCP模型參數

2021-04-04 22:31:26

白帽子廠商漏洞

2018-03-26 09:39:06

大數據IT互聯網

2020-09-24 10:49:09

iOSiPadOSBug

2021-02-19 11:01:46

異步競態接口異步

2021-12-26 14:32:11

緩存數據庫數據

2021-12-30 09:32:04

緩存數據庫數據

2020-04-26 14:40:19

戴爾

2024-03-18 08:14:07

SpringDAOAppConfig
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 毛片一级网站 | 久久久99国产精品免费 | 视频国产一区 | 国产精品久久久久永久免费观看 | 日本亚洲一区 | 视频一区二区在线观看 | 国产成人免费视频 | 福利社午夜影院 | 中文字幕一区二区三区精彩视频 | 久草在线免费资源 | 亚洲国产精品精华素 | 欧产日产国产精品99 | 欧美精品一区二区三区在线播放 | 北条麻妃一区二区三区在线视频 | 日本超碰| 国产精品久久久久久吹潮日韩动画 | 日本一区二区三区四区 | 免费h视频 | 毛片链接| www国产亚洲精品久久网站 | 精品国产aⅴ| 国产精品亚洲精品久久 | 亚洲手机视频在线 | 国产在线资源 | www.亚洲区 | 欧美日韩在线一区 | 亚洲免费观看视频 | 久草新视频 | 中文字幕一区二区三区日韩精品 | 欧美日韩在线综合 | 天天操人人干 | 日韩av在线播 | 麻豆久久久久久久 | 婷婷丁香激情 | 狠狠干美女 | 在线第一页 | 久久av一区二区三区 | 在线观看免费av网 | 高清一区二区三区 | 福利视频三区 | 国产成人一区二区 |