一起學習Mysql Mysql資料型別優化

2021-10-24 01:57:29 字數 3245 閱讀 1873

每日一句:那些說星星好看的人一定沒有看過你的眼睛

在資料庫的優化過程中,大的方向分為資料庫表優化、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:varchar(5)varchar(200)儲存同乙個字串hello,有什麼區別嗎?

可以從兩個方面來說:

兩個在儲存hello到磁碟上占用的記憶體空間是相同的,因為varchar是可變長度的型別,儲存到磁碟上使用的是同乙個字串,所以記錄的長度都相同

但是如果在排序和統計的時候,mysql會給這兩個長度分配不同記憶體來進行排序,就算儲存相同的字串,但是mysql會分配不同的記憶體。

所以,在定義列的型別時,更小的型別一般更好

blob/text

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。其實,也是很不錯的。大家可以根據自己專案的情況來進行選擇。然後,我們自...