MySql資料優化

2021-10-22 00:17:29 字數 2879 閱讀 6915

更小的通常越好

更小的資料型別占用更小的磁碟空間,記憶體和cpu快取,並且處理時需要的cpu週期也更少

注意不能低估需要儲存的值的範圍

簡單就好

簡單資料型別的操作通常需要更少的cpu週期如整型比字元操作代價更低

使用mysql內建的型別而不是字串來儲存日期和時間

應該用整型儲存ip位址

避免null值

通常情況下最好指定列為not null,除非真的需要儲存null值

查詢種包含null使得索引,索引統計和值比較都更複雜

可為null的列會使用更多的儲存空間

調優時將null改為not null 帶來的效能提公升較小,所以沒有必要首先這麼做,但在設計時需要注意

datetime與timestamp都可以儲存相同型別的資料:時間和日期,精確到秒,但後者只佔一半的儲存空間,而且會隨著時區變化而自動更新

儲存範圍由-2(n-1)   ----->    2(n-1)-1

int(11)並不是說用11位去儲存,而是說顯示為11位寬度,但實際儲存是不變的,也就是說int(1)與int(20)儲存空間是相同的

以bigint作為內部運算的格式但一些聚合函式也以double,decimal作為運算格式

tinyint(8)

smallint(16)

mediuint(24)

int(32)

bigint(64)

標誌無符號正數,可以將正數的範圍提高一倍,但兩者具有相同的儲存空間和效能

實數是指含有小數部分的數字

float(4)

double(8)

decimal(最多65位)

用於儲存精確的小數,但其只是一種儲存格式,計算時依舊採用double

可以指定小數點前後的位數

如decimal(18,9)指總位數為18,佔9個位元組,4個位元組儲存9位,小數點佔乙個位元組

mysql以double作為內部浮點計算的型別

cpu支援原生浮點計算,但不支援直接的decimal計算(由mysql伺服器自己實現),所以前者的速度要快一些

應當只在需要對小數進行精確運算時才會選擇decimal,也可以將實數乘以10的倍數從而用bigint儲存

最多65535個位元組

varchar用於儲存可變長字串

除了儲存的字串外,還需一或兩個位元組儲存每個字串的長度

問題由於是變長的,在update時很可能出現長度增加的情況(原本只用了5個位元組,現在變成了11個)不同的儲存引擎會使用不同的方式處理

使用時機

字串列的最大長度遠大於平均長度(這樣update時不會出現頻繁的空間不夠的情況)

列的更新很少

採用utf-8這種複雜的編碼(字元使用不同的位元組數儲存)

最多255個位元組

儲存定長的字串,mysql會根據定義的字串長度,分配足夠的空間,

如果字串長度不夠,會在後面新增空格查詢時再去掉空格(這是在mysql服務層進行處理的,與儲存引擎無關)

使用時機

適合儲存較短的字串或者字元長度差不多的字串

注意: char(n),varchar(n)裡面的n代表字元(不是位元組!!!!)

最好不要使用,使用也需要substring(column,length)將其轉化成足夠小的字串

mysql儲存的最小時間粒度為秒(maraia儲存引擎為微秒)但可以使用微秒級的粒度進行臨時計算

能儲存最大範圍的數從1001-9999,精度為秒

封裝格式: yyyy-mm-dd hh:mm:ss(去掉分隔符後用整數儲存)

占用8個位元組儲存

可排序只使用四個位元組,時間範圍為1970-2038

mysql4.1及更新的版本按照datatime格式化timestamp(之前沒有分隔符),但是內部儲存格式是不變的

timestamp資料會隨著時區更新,而datetime只顯示固定的文字

timestamp預設為not null

插入時如果沒有指定timestamp會自動插入當前時間

所有位型別,從技術上來說都是字串

int_ntoa(),int_aton()進行轉化

第一正規化,不能表中有表

第二正規化,所有屬性都要與主屬性相關

第三正規化,所有屬性都要與主屬性直接相關

可以很好的避免關聯(所有資料都在一張表中),這樣也能使用更有效的索引策略

其實和普通表的差別不大,就是把要查詢

用新的結構建立空表

從舊表查出資料插入新錶

刪除舊表

速度慢在不提供服務的伺服器上執行操作,然後和提供服務的伺服器進行主從切換

影子拷貝,用要求的表結構建立一張和源表無關的新錶,然後通過重新命名和刪表操作交換兩張表

建立新錶(與源表無關)

將資料插入新錶

插入完成後將源表刪除,新錶重新命名成為新的原表

不是所有alter table都會重建表

為了高效匯入資料,可以先禁用索引,資料匯入後再啟用索引

對唯一索引無效,disable keys 只對非唯一索引有效

也可以先刪除所有非唯一索引,資料匯入後,再重新建立索引

mysql優化資料

全表掃瞄是資料庫搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。通常在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄 然而有時候我們即便新增了索引,但當我們的sql語句寫的不合理的時候也會造成全表掃瞄。以下是經常會造成全表掃瞄的sql語句及應對措施 1.使用null做為判斷條件 如 s...

Mysql資料優化

1.linux上安裝mysql 虛擬機器上裝linux系統,啟動,ifconfig檢視當前linux,ip位址。通過遠端工具securecrtportable 遠端命令列進行連線 登入linux檢視當前mysql安裝包版本 rpm qa grep i mysql 解除安裝 rpm e mysql l...

Mysql海量資料優化

1.選擇合適的儲存引擎 兩個儲存引擎 myisam 和 innodb myisam合適count 但寫效能不好 innodb合適併發讀寫 事物 2.優化字段資料 3.為字段建立索引 4.避免使用select 5.使用 enum 而不是 varchar 6.盡可能的使用 not null 7.固定長度...