2023-11-02 分類: 網(wǎng)站建設
本文的內(nèi)容是總結(jié)一些MySQL的常見使用技巧,以供沒有DbA的團隊參考。以下內(nèi)容以MySQL5.5為準,如無特殊說明,存儲引擎以InnoDb為準。
了解MySQL的特點有助于更好的使用MySQL,MySQL和其它常見數(shù)據(jù)庫大的不同在于存在存儲引擎這個概念,存儲引擎負責存儲和讀取數(shù)據(jù)。不同的存儲引擎具有不同的特點,用戶可以根據(jù)業(yè)務的特點選擇適合的存儲引擎,甚至是開發(fā)一個新的引擎。MySQL的邏輯架構大致如下:
MySQL默認的存儲引擎是InnoDb,該存儲引擎的主要特點是:
支持事務處理
支持行級鎖
數(shù)據(jù)存儲在表空間中,表空間由一些列數(shù)據(jù)文件組成
采用MVVC(多版本并發(fā)控制)機制實現(xiàn)高并發(fā)
表基于主鍵的聚簇索引建立
支持熱備份
其它常見存儲引擎特點概述:
MyISAM:老版本MySQL的默認引擎,不支持事務和行級鎖,開發(fā)者可以手動控制表鎖;支持全文索引;崩潰后無法安全恢復;支持壓縮表,壓縮表數(shù)據(jù)不可修改,但占用空間較少,可以提高查詢性能
Archive:只支持Insert和Select,批量插入很快,通過全表掃描查詢數(shù)據(jù)
SCV:把一個SCV文件當做一個表處理
Memory:數(shù)據(jù)存儲在內(nèi)存中
還有很多,不再一一列舉。
選擇數(shù)據(jù)類型的原則:
選擇占用空間小的數(shù)據(jù)類型
選擇簡單的類型
避免不必要的可空列
占用空間小的類型更節(jié)省硬件資源,如磁盤、內(nèi)存和CpU。盡量使用簡單的類型,如能用int
就不用char
,因為后者的排序涉及到字符集的選擇,比使用int
復雜。可空列使用更多的存儲空間,如果在可空列上創(chuàng)建索引,MySQL需要額外的字節(jié)做記錄。創(chuàng)建表時,默認都是可空,容易被開發(fā)者忽視,最好是手動改為不可空,如果要存儲的數(shù)據(jù)確實不會有空值的話。
整型類型包括:
tinyint
smallint
mediumint
int
bigint
它們分別使用8、16、24、32和64位存儲數(shù)字,它們可以表示范圍的數(shù)字,前面可以加unsigned修飾,這樣可以讓正數(shù)的可表示范圍提高1倍,但是無法表示負數(shù)。另外,為整型指定長度沒什么卵用,數(shù)據(jù)類型定下來,長度也就相應定下來了。
float
double
decimal
float
和double
就是通常意義上的float
和double
,前者使用32位存儲數(shù)據(jù),后者使用64位存儲數(shù)據(jù),和整型一樣,為它們指定長度沒什么卵用。
decimal
類型比較復雜,支持精確計算,占用的空間也大,decimal
使用每4個字節(jié)表示9個數(shù)字,如decimal(18,9)
表示數(shù)字長度是18,其中小數(shù)位9個數(shù)字,整數(shù)部分9個數(shù)字,加上小數(shù)點本身,共占用9個字節(jié)??紤]到decimal
占用空間較多,以及精度計算很復雜,數(shù)據(jù)量大的時候可以考慮用bigint
代替之,可以在持久化和讀取前對真實數(shù)據(jù)進行一些縮放操作。
varchar
char
varbinary
binary
blob
text
枚舉
varchar類型數(shù)據(jù)實際占用空間等于字符串的長度加上1個或2個用來記錄字符串長度的字節(jié)(當row-format沒有被設置為fixed時),varchar很節(jié)省空間。當表中某列字符串類型的數(shù)據(jù)長度差別較大時適合使用varchar。
char的實際占用空間是固定的,當表中字符串數(shù)據(jù)的長度相差無幾或很短時適合使用chart類型。
與varchar和char對應的有varbinary和binary,后者存儲的是二進制字符串,和前者相比,后者大小寫敏感,不用考慮編碼方式,執(zhí)行比較操作時更快。
需要注意的是:雖然varchar(5)和varchar(200)在存儲“hello”這個字符串時使用相同的存儲空間,但并不意味著將varchar的長度設置太大不會影響性能,實際上,MySQL的某些內(nèi)部計算,比如創(chuàng)建內(nèi)存臨時表時(某些查詢會導致MySQL自動創(chuàng)建臨時表),會分配固定大小的空間存放數(shù)據(jù)。
blob使用二進制字符串保存大文本,text使用字符保存大文本,InnoDb會使用專門的外部存儲區(qū)來存放此類數(shù)據(jù),數(shù)據(jù)行內(nèi)僅存放指向他們的指針,此類數(shù)據(jù)不宜創(chuàng)建索引(要創(chuàng)建也只能正對字符串前綴創(chuàng)建),不過也不會有人這么干。
如果某列字符串大量重復且內(nèi)容有限,可使用枚舉代替,MySQL處理枚舉時維護了一個“數(shù)字-字符串”表,使用枚舉可以減少很多存儲空間。
year
date
time
datetime
timestamp
datetime存儲范圍是1001到9999,精確到秒。timestamp存儲1970年1月1日午夜以來的秒數(shù),可以表示到2038年。占用4個字節(jié),是datetime占用空間的一半。timestamp表示的時間和時區(qū)有關,另外timestamp列還有個特性,執(zhí)行insert或update語句時,MySQL會自動更新第一個類型為timestamp的列的數(shù)據(jù)為當前時間。很多表中都有設計有一列叫做UpdateTime,這個列使用timestamp倒是挺合適的,會自動更新,前提是系統(tǒng)不會使用到2038年。
盡可能使用整型,整型占用空間少,還可以設置為自動增長。尤其別使用GUID,MD5等哈希值字符串作為主鍵,這類字符串隨機性很大,由于InnoDb主鍵默認是聚簇索引列,所以導致數(shù)據(jù)存儲太分散。另外,InnoDb的二級索引列中默認包含主鍵列,如果主鍵太長,也會使得二級索引很占空間。
存儲Ip最好使用32位無符號整型,MySQL提供了函數(shù)inet_aton()和inet_ntoa()進行Ip地址的數(shù)字表示和字符串表示之間的轉(zhuǎn)換。
InnoDb使用b+樹實現(xiàn)索引,舉個例子,假設有個people,建表語句如下
CREATE table `people` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(5) NOT NULL,
`Age` tinyint(4) NOT NULL,
`Number` char(5) NOT NULL COMMENT '編號',
pRIMARY KEY (`Id`),
KEY `i_name_age_number` (`Name`,`Age`,`Number`)
) ENGINE=InnoDb AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
插入數(shù)據(jù):
它的索引結(jié)構大致是這樣的:
也就是說,索引列的順序很重要,如果兩行數(shù)據(jù)的Name列相同,則用Age列比較大小,如果Age列相同,則用Number列比較大小。先用第一列排序,然后是第二列,最后是第三列。
查詢的
本文題目:MySQL數(shù)據(jù)庫優(yōu)化讓數(shù)據(jù)庫讀取更快
鏈接地址:http://www.rwnh.cn/news43/292093.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設、用戶體驗、ChatGPT、虛擬主機、域名注冊、網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容