每日一句:那些說星星好看的人一定沒有看過你的眼睛在資料庫的優化過程中,大的方向分為資料庫表優化、sql優化、伺服器優化等這幾方面,其中一般在開發過程中,常規的優化的點主要就是前2項,也是開發人員直接參與的兩點。本文就簡單從資料表優化介紹(資料型別優化)
資料型別的選擇的要點有哪些?以上三點看起來很簡單,應該是大多數時設計資料庫也會去遵循的規則。具體代表什麼意思呢?
mysql資料庫有兩種型別的數字,整數和實數整數
如果儲存整數,有以下幾種型別:tinyint(1)、smallint(2)、mediumint(3)、int(4)、bigint(8),括號中代表該型別占用的位元組
整數的優化要點:
實數如果儲存實數,有以下幾種型別:float、double、decimal。一般在更精確的計算中使用decimal。
字串型別有以下幾種:char、varchar、blob、text。char/varchar為一組,blob/text為一組。
char
型別在查詢和更新相當於varchar
更快
varchar
**小知識點1:**一般定義varchar(255)就認為是最大值,是最大的嗎?其實不是的,varchar最大可以儲存65535個位元組,之所以是varhcar(255) 這個裡面是255字元,是因為innodb中,對於字串可以索引的最大位元組為767,255*3=765位元組,765+1+1=767,1個位元組表示額外空間,1個位元組表示可為null。
小知識點2:blob/textvarchar(5)
和varchar(200)
儲存同乙個字串hello
,有什麼區別嗎?可以從兩個方面來說:
兩個在儲存
hello
到磁碟上占用的記憶體空間是相同的,因為varchar
是可變長度的型別,儲存到磁碟上使用的是同乙個字串,所以記錄的長度都相同但是如果在排序和統計的時候,mysql會給這兩個長度分配不同記憶體來進行排序,就算儲存相同的字串,但是mysql會分配不同的記憶體。
所以,在定義列的型別時,更小的型別一般更好
blob/text
是為儲存很大的資料設計的字串型別。
使用列舉替換字串
mysql中也有列舉型別,列舉定義:一系列不重複字串的預定義集合。
例如:
create
table enum_test (
e enum(,
'dog'))
# 插入資料的時候,對於列舉欄位的資料,只可以是在建立時預定義的集合(或者alter修改列舉的預定義集合增加)
insert
into enum_test(e)
values()
;insert
into enum_test(e)
values
('dog'
);
mysql日期型別有:date、time、datetime、timestamp
日期型別中有兩種相似的datetime
或者timestamp
為標識列選擇合適的資料型別對於查詢效率提公升也很大,例如:主鍵、外來鍵等標識列
小知識點:如果使用列來儲存ip,選擇什麼資料型別?在開發過程中,一般來講不會出現極端的正規化,也不可能出現完全的反正規化,都是混合使用,具體情況具體分析,總體符合某種情況下可以提公升對資料庫操作的效能。推薦使用整型來儲存,因為ip就是32位的無符號整數,中間帶上小數點只是為了方便閱讀。mysql中提供
inet_aton()
、inet_ntoa()
函式來對ip和數字之間進行轉換select inet_aton(
'192.104.11.1')-
>
3228044033
select inet_ntoa(
3228044033)-
>
192.104
.11.1
缺點
反正規化
反正規化的資料庫中,會存在冗餘的列作為業務場景的需要,減少表的關聯查詢。
優點
缺點
相對來說在實際應用中,正規化和反正規化會混合使用,根據具體情況具體選擇。在反正規化的情況下,根據更新頻率、查詢頻率等選擇冗餘的列(因為更新在反正規化會較為複雜,查詢頻率高的列可以作為冗餘列來減少連表查詢)mysql的
alter table
操作表的結構的時候,大多數情況下都會鎖表並重建表,具體的過程為:使用新的表結構建立乙個空表,然後對舊表進行鎖表並查詢資料插入到新錶中,然後刪除舊表。這個操作非常耗時並且會阻塞mysql對該錶的其他操作。如果該錶還有大量的索引,就會更慢。如果表很大而且記憶體不足,就會更慢。
例如:小小的總結一下,資料型別的優化有:修改列的預設值:
alter table *** modify column yyy tinyint(3) not null default 5;
modify column
就會鎖表並重建表,如果表資料量大會相當慢,所有的modify column
都會重建表使用更快的方式:
alter table *** alter column yy set default 5;
alter column
就會更快,不涉及重建表操作。
你的點讚和關注是寫文章最大的動力~
一起學習Mysql Mysql的複製原理
一起學習mysql 系列,對於開發過程中對mysql的優化最重要的節點在前面幾篇文章中提到了一些,不過還是需要不斷的總結和思考,才可以更好的優化mysql。本篇文章,下面就簡單的說一下mysql關於複製的一些知識點,如果有更好的見解,可以一起討論 mysql的複製即增加一台mysql例項,和主庫進行...
開源一起學習
要想自己學習機器學習,3本 聖經 是一定要看的 花書,西瓜書,和統計學習方法 但不是剛入門就要看的,首先啊,我們必須學好學校教的c語言,對程式設計有乙個初步的了解,其次,我們都知道python的厲害,可以幹很多事,也很出名,這就出現了人人都知道py,但不是人人都懂py的現象。確實要想搞機器學習,你最...
一起學習extjs( )
可以說,extjs是系統類專案最好的ui 前端使用者介面 選擇,特別是自從extjs4.0出來後,不管是 美觀還是效能的提高,及其功能之強大,說它排第一,無可厚非。當然,最近也蠻流行easyui這個輕量級的,據說是國人開發的ui。其實,也是很不錯的。大家可以根據自己專案的情況來進行選擇。然後,我們自...