👉 這是一個或許對你有用的社群
《專案實戰(影片)》:從書中學,往事上“練” 《網際網路高頻面試題》:面朝簡歷學習,春暖花開 《架構 x 系統設計》:摧枯拉朽,掌控面試高頻場景題 《精進 Java 學習指南》:系統學習,網際網路主流技術棧 《必讀 Java 原始碼專欄》:知其然,知其所以然

👉這是一個或許對你有用的開源專案國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERP、CRM、AI 大模型等等功能:
Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud 影片教程:https://doc.iocoder.cn 【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本

一. 問題描述
-
對於可變長度的欄位,在滿足條件的前提下,儘可能使用較短的變長欄位長度。
-
基於儲存空間的考慮 -
基於效能的考慮
Varchar(50)
和varchar(500)
儲存空間上是一樣的,真的是這樣嗎?基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/ruoyi-vue-pro 影片教程:https://doc.iocoder.cn/video/
二.驗證儲存空間區別
1.準備兩張表
CREATETABLE`category_info_varchar_50`
(
`id`bigint
(
20
)
NOTNULL
AUTO_INCREMENT
COMMENT'主鍵'
,
`name`varchar
(
50
)
NOTNULLCOMMENT'分類名稱'
,
`is_show`tinyint
(
4
)
NOTNULLDEFAULT'0'COMMENT'是否展示:0 停用,1啟用'
,
`sort`int
(
11
)
NOTNULLDEFAULT'0'COMMENT'序號'
,
`deleted`tinyint
(
1
)
DEFAULT'0'COMMENT'是否刪除'
,
`create_time`
datetime
NOTNULLCOMMENT'建立時間'
,
`update_time`
datetime
NOTNULLCOMMENT'更新時間'
,
PRIMARY
KEY
(
`id`
)
USING
BTREE,
KEY`idx_name`
(
`name`
)
USING
BTREE
COMMENT'名稱索引'
)
ENGINE
=
InnoDBDEFAULTCHARSET
=utf8mb4
COMMENT
=
'分類'
;
CREATETABLE`category_info_varchar_500`
(
`id`bigint
(
20
)
NOTNULL
AUTO_INCREMENT
COMMENT'主鍵'
,
`name`varchar
(
500
)
NOTNULLCOMMENT'分類名稱'
,
`is_show`tinyint
(
4
)
NOTNULLDEFAULT'0'COMMENT'是否展示:0 停用,1啟用'
,
`sort`int
(
11
)
NOTNULLDEFAULT'0'COMMENT'序號'
,
`deleted`tinyint
(
1
)
DEFAULT'0'COMMENT'是否刪除'
,
`create_time`
datetime
NOTNULLCOMMENT'建立時間'
,
`update_time`
datetime
NOTNULLCOMMENT'更新時間'
,
PRIMARY
KEY
(
`id`
)
USING
BTREE,
KEY`idx_name`
(
`name`
)
USING
BTREE
COMMENT'名稱索引'
)
ENGINE
=
InnoDB
AUTO_INCREMENT=
288135DEFAULTCHARSET
=utf8mb4
COMMENT
=
'分類'
;
2.準備資料
DELIMITER $$
CREATE PROCEDURE batchInsertData(IN total INT)
BEGIN
DECLARE start_idx INT DEFAULT 1;
DECLARE end_idx INT;
DECLARE batch_size INT DEFAULT 500;
DECLARE insert_values TEXT;
SET end_idx = LEAST(total, start_idx + batch_size - 1);
WHILE start_idx <= total DO
SET insert_values =
''
;
WHILE start_idx <= end_idx DO
SET insert_values = CONCAT(insert_values, CONCAT(
'(\'
name
', start_idx, '
\
', 0, 0, 0, NOW(), NOW()),'
));
SET start_idx = start_idx + 1;
END WHILE;
SET insert_values = LEFT(insert_values, LENGTH(insert_values) - 1); -- Remove the trailing comma
SET @sql = CONCAT(
'INSERT INTO category_info_varchar_50 (name, is_show, sort, deleted, create_time, update_time) VALUES '
, insert_values,
';'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
SET @sql = CONCAT(
'INSERT INTO category_info_varchar_500 (name, is_show, sort, deleted, create_time, update_time) VALUES '
, insert_values,
';'
);
PREPARE stmt FROM @sql;
EXECUTE stmt;
SET end_idx = LEAST(total, start_idx + batch_size - 1);
END WHILE;
END$$
DELIMITER ;
CALL batchInsertData(1000000);
3.驗證儲存空間
SELECT
table_schema
AS"資料庫"
,
table_name
AS"表名"
,
table_rows
AS"記錄數"
,
TRUNCATE
( data_length /
1024
/
1024
,
2
)
AS"資料容量(MB)"
,
TRUNCATE
( index_length /
1024
/
1024
,
2
)
AS"索引容量(MB)"
FROM
information_schema.TABLES
WHERE
table_schema =
'test_mysql_field'
and
TABLE_NAME =
'category_info_varchar_50'
ORDERBY
data_length
DESC
,
index_length
DESC
;

SELECT
table_schema
AS"資料庫"
,
table_name
AS"表名"
,
table_rows
AS"記錄數"
,
TRUNCATE
( data_length /
1024
/
1024
,
2
)
AS"資料容量(MB)"
,
TRUNCATE
( index_length /
1024
/
1024
,
2
)
AS"索引容量(MB)"
FROM
information_schema.TABLES
WHERE
table_schema =
'test_mysql_field'
and
TABLE_NAME =
'category_info_varchar_500'
ORDERBY
data_length
DESC
,
index_length
DESC
;

4.結論
基於 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
專案地址:https://github.com/YunaiV/yudao-cloud 影片教程:https://doc.iocoder.cn/video/
三.驗證效能區別
1.驗證索引覆蓋查詢
selectnamefrom
category_info_varchar_50
wherename
=
'name100000'
-- 耗時0.012s
selectnamefrom
category_info_varchar_500
wherename
=
'name100000'
-- 耗時0.012s
selectnamefrom
category_info_varchar_50
orderbyname
;
-- 耗時0.370s
selectnamefrom
category_info_varchar_500
orderbyname
;
-- 耗時0.379s
1.驗證索引查詢
select
*
from
category_info_varchar_50
wherename
=
'name100000'
--耗時 0.012s
select
*
from
category_info_varchar_500
wherename
=
'name100000'
--耗時 0.012s
select
*
from
category_info_varchar_50
wherenamein
(
'name100'
,
'name1000'
,
'name100000'
,
'name10000'
,
'name1100000'
,
'name200'
,
'name2000'
,
'name200000'
,
'name20000'
,
'name2200000'
,
'name300'
,
'name3000'
,
'name300000'
,
'name30000'
,
'name3300000'
,
'name400'
,
'name4000'
,
'name400000'
,
'name40000'
,
'name4400000'
,
'name500'
,
'name5000'
,
'name500000'
,
'name50000'
,
'name5500000'
,
'name600'
,
'name6000'
,
'name600000'
,
'name60000'
,
'name6600000'
,
'name700'
,
'name7000'
,
'name700000'
,
'name70000'
,
'name7700000'
,
'name800'
,
'name8000'
,
'name800000'
,
'name80000'
,
'name6600000'
,
'name900'
,
'name9000'
,
'name900000'
,
'name90000'
,
'name9900000'
)
-- 耗時 0.011s -0.014s
-- 增加 order by name 耗時 0.012s - 0.015s
select
*
from
category_info_varchar_50
wherenamein
(
'name100'
,
'name1000'
,
'name100000'
,
'name10000'
,
'name1100000'
,
'name200'
,
'name2000'
,
'name200000'
,
'name20000'
,
'name2200000'
,
'name300'
,
'name3000'
,
'name300000'
,
'name30000'
,
'name3300000'
,
'name400'
,
'name4000'
,
'name400000'
,
'name40000'
,
'name4400000'
,
'name500'
,
'name5000'
,
'name500000'
,
'name50000'
,
'name5500000'
,
'name600'
,
'name6000'
,
'name600000'
,
'name60000'
,
'name6600000'
,
'name700'
,
'name7000'
,
'name700000'
,
'name70000'
,
'name7700000'
,
'name800'
,
'name8000'
,
'name800000'
,
'name80000'
,
'name6600000'
,
'name900'
,
'name9000'
,
'name900000'
,
'name90000'
,
'name9900000'
)
-- 耗時 0.012s -0.014s
-- 增加 order by name 耗時 0.014s - 0.017s
3.驗證全表查詢和排序
全表無排序


全表有排序
select
*
from
category_info_varchar_50
orderbyname
;
--耗時 1.498s
select
*
from
category_info_varchar_500
orderbyname
;
--耗時 4.875s


結論:
分析原因
varchar50 全表執行sql分析



varchar500 全表執行sql分析



❝Number of merge passes that the sort algorithm has had to do. If this value is large, you may want to increase the value of the sort_buffer_size.❞
四.最終結論





