MySQL資料型別選擇效能比對詳解
阿新 • • 發佈:2018-11-27
在關係型 資料庫 建表期間,我們需要考慮很多很多的事項。諸如表儲存什麼資料,列上使用的資料型別,選擇什麼樣的儲存引擎等等。本文主要介紹針對表上列使用三種不同的資料型別來進行對比,以觀察選擇不同資料型別時,對於效能造成的影響。
一、建表時需要考慮的事項
作用:
儲存什麼資料?
結構:
包含什麼列,需要約束嗎?
儲存:
每一列使用什麼資料型別?需要索引嗎?
引擎:
使用什麼儲存引擎呢?
資料篩選:
哪些列被頻繁用作過濾條件?增刪改查頻率?
一、構造測試環境
CREATE TABLE `tb_char` ( `uid` int(11) NOT NULL AUTO_INCREMENT, `mobile` char(11) DEFAULT NULL, `passwd` varchar(50) DEFAULT NULL, `name` varchar(50) DEFAULT NULL, `sex` tinyint DEFAULT NULL, `birthday` datetime DEFAULT NULL, `updated_time` datetime DEFAULT NULL, PRIMARY KEY (`uid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 使用三個表相同mobile列使用三種不同資料型別,分別為: Char(11) Varchar(11) Bigint(11) 對應表名分別為: tb_char tb_varchar tb_bigint 三張表總記錄數100W, 測試環境: ([email protected]) [tempdb]> show variables like 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.7.23-log | +---------------+------------+ select 'Leshami' author,'http://blog.csdn.net/leshami' Blog; +---------+------------------------------+ | author | Blog | +---------+------------------------------+ | Leshami | http://blog.csdn.net/leshami | +---------+------------------------------+
二、基於無索引情形比對
表上統計資訊,mysql統計資訊不是很準確,如下圖,基於bigint資料型別佔用的磁碟你空間與char型別佔用磁碟空間等同。varchar變長要大一些。因為varchar需要單獨的位元組來存放字元終止資訊。
-- 下面執行以下三條SQL語句比對效能 SELECT * FROM tb_char WHERE mobile = '17998335908'; SELECT * FROM tb_varchar WHERE mobile = '17998335908'; SELECT * FROM tb_bigint WHERE mobile = 17998335908;
每條SQL總計執行10次,觀察每條好用的平均時間,bigint效能最佳。
二、基於索引情形比對
下面為過濾條件列mobile新增索引列,觀察效能表現
CREATE INDEX uk_mobile ON tb_char(mobile); CREATE INDEX uk_mobile ON tb_varchar(mobile); CREATE INDEX uk_mobile ON tb_bigint(mobile);
如下圖所示,索引佔用磁碟開銷是bigint資料型別最小,基於索引查詢的時間,三者相當
三、基於索引列分組聚合情形比對
為了更好比對效能,下面基於索引列進行分組以及聚合運算,可以看出依舊是bigint資料型別效能最佳
四、最終比對結果及結論
最終完整結果圖:
結論:
1)滿足需求的前提使用更小長度的資料型別(更少磁碟佔用,I/O,CPU,memory開銷)
2)整型優先原則,使用簡單資料型別
3)避免使用NULL欄位,NULL欄位很難查詢優化、的索引需要額外空間、複合索引無效
4)少用text/blob,varchar的效能會比text高很多