MySQL數據類型選擇性能比對

在關係型數據庫建表期間,我們需要考慮很多很多的事項。諸如表存儲什麼數據,列上使用的數據類型,選擇什麼樣的存儲引擎等等。本文主要介紹針對表上列使用三種不同的數據類型來進行對比,以觀察選擇不同數據類型時,對於性能造成的影響。

一、建表時需要考慮的事項

作用:
   存儲什麼數據?
結構:
   包含什麼列,需要約束嗎?
存儲:
   每一列使用什麼數據類型?需要索引嗎?
引擎:
   使用什麼存儲引擎呢?
數據篩選:
   哪些列被頻繁用作過濾條件?增刪改查頻率?

一、構造測試環境

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,

測試環境:
(root@localhost) [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高很多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章