1. 程式人生 > >MySQL資料型別選擇效能比對詳解

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,

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