java進階,sql核心技術:Mysql優化之精髓總結一。

在這裏插入圖片描述
本文知識點較多,篇幅較長,請耐心學習
MySQL已經成爲時下關係型數據庫產品的中堅力量,備受互聯網大廠的青睞,出門面試想進BAT,想拿高工資,不會點MySQL優化知識,拿offer的成功率會大大下降

爲什麼要優化
系統的吞吐量瓶頸往往出現在數據庫的訪問速度上
隨着應用程序的運行,數據庫的中的數據會越來越多,處理時間會相應變慢
數據是存放在磁盤上的,讀寫速度無法和內存相比
如何優化
設計數據庫時:數據庫表、字段的設計,存儲引擎
利用好MySQL自身提供的功能,如索引等
橫向擴展:MySQL集羣、負載均衡、讀寫分離
SQL語句的優化(收效甚微)
字段設計
字段類型的選擇,設計規範,範式,常見設計案例

原則:儘量使用整型表示字符串
存儲IP
INET_ATON(str),address to number

INET_NTOA(number),number to address

MySQL內部的枚舉類型(單選)和集合(多選)類型
但是因爲維護成本較高因此不常使用,使用關聯表的方式來替代enum

原則:定長和非定長數據類型的選擇
decimal不會損失精度,存儲空間會隨數據的增大而增大。double佔用固定空間,較大數的存儲會損失精度。非定長的還有varchar、text

金額
對數據的精度要求較高,小數的運算和存儲存在精度問題(不能將所有小數轉換成二進制)

定點數decimal
price decimal(8,2)有2位小數的定點數,定點數支持很大的數(甚至是超過int,bigint存儲範圍的數)

小單位大數額避免出現小數
元->分

字符串存儲
定長char,非定長varchar、text(上限65535,其中varchar還會消耗1-3字節記錄長度,而text使用額外空間記錄長度)

原則:儘可能選擇小的數據類型和指定短的長度
原則:儘可能使用 not null
非null字段的處理要比null字段的處理高效些!且不需要判斷是否爲null。

null在MySQL中,不好處理,存儲需要額外空間,運算也需要特殊的運算符。如select null = null和select null <> null(<>爲不等號)有着同樣的結果,只能通過is null和is not null來判斷字段是否爲null。

如何存儲?MySQL中每條記錄都需要額外的存儲空間,表示每個字段是否爲null。因此通常使用特殊的數據進行佔位,比如int not null default 0、string not null default ‘’

原則:字段註釋要完整,見名知意
原則:單表字段不宜過多
二三十個就極限了

原則:可以預留字段
在使用以上原則之前首先要滿足業務需求

關聯表的設計
外鍵foreign key只能實現一對一或一對多的映射

一對多
使用外鍵

多對多
單獨新建一張表將多對多拆分成兩個一對多

一對一
如商品的基本信息(item)和商品的詳細信息(item_intro),通常使用相同的主鍵或者增加一個外鍵字段(item_id)

範式 Normal Format
數據表的設計規範,一套越來越嚴格的規範體系(如果需要滿足N範式,首先要滿足N-1範式)。N

第一範式1NF:字段原子性
字段原子性,字段不可再分割。

關係型數據庫,默認滿足第一範式

注意比較容易出錯的一點,在一對多的設計中使用逗號分隔多個外鍵,這種方法雖然存儲方便,但不利於維護和索引(比如查找帶標籤java的文章)

第二範式:消除對主鍵的部分依賴
即在表中加上一個與業務邏輯無關的字段作爲主鍵

主鍵:可以唯一標識記錄的字段或者字段集合。

course_name course_class weekday(周幾) course_teacher
MySQL 教育大樓1525 週一 張三
Java 教育大樓1521 週三 李四
MySQL 教育大樓1521 週五 張三
依賴:A字段可以確定B字段,則B字段依賴A字段。比如知道了下一節課是數學課,就能確定任課老師是誰。於是周幾和下一節課和就能構成複合主鍵,能夠確定去哪個教室上課,任課老師是誰等。但我們常常增加一個id作爲主鍵,而消除對主鍵的部分依賴。

對主鍵的部分依賴:某個字段依賴複合主鍵中的一部分。

解決方案:新增一個獨立字段作爲主鍵。

第三範式:消除對主鍵的傳遞依賴
傳遞依賴:B字段依賴於A,C字段又依賴於B。比如上例中,任課老師是誰取決於是什麼課,是什麼課又取決於主鍵id。因此需要將此表拆分爲兩張表日程表和課程表(獨立數據獨立建表):

id weekday course_class course_id
1001 週一 教育大樓1521 3546
course_id course_name course_teacher
3546 Java 張三
這樣就減少了數據的冗餘(即使週一至週日每天都有Java課,也只是course_id:3546出現了7次)

發佈了39 篇原創文章 · 獲贊 28 · 訪問量 8507
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章