工具小筆記|MySQL 索引效能測試筆記(含 1.4 億筆資料)

更新 發佈閱讀 7 分鐘

偶爾在開發時會遇到查詢變慢的狀況,不禁懷疑:「加個 index 就能解決嗎?哪一種索引才有效?」這讓我決定做個簡單實驗,用 MySQL 建立一個大量資料表,實際對比有無索引、單一索引與複合索引下的查詢時間差異。

這篇筆記是我在 MySQL Workbench 上測試索引效能的記錄,包含從建立資料表、匯入測試資料到不同索引策略下的查詢結果與 EXPLAIN 分析。


database-index 是什麼?

簡單來說,就是:

建立測試資料表與大量資料,並實測各種索引設定對查詢速度的影響。


使用工具

  • 📦 MySQL Workbench 8.0 CE
  • 📁 測試資料:10,000 筆(t.sql)與 1.4 億筆資料(t4.sql)

測試資料與環境

建立資料庫與匯入

CREATE DATABASE `test_database`;

匯入資料檔案:

  • t.sql(約 10,000 筆)
  • t4.sql(約 139,000,000 筆)

產生測試資料

CREATE TABLE T( 
Id INT AUTO_INCREMENT PRIMARY KEY,
UserId INT,
UserGroup INT
);

INSERT INTO T (UserId,UserGroup)
SELECT ROUND(1.0 + RAND() * 10000),
ROUND(1.0 + RAND() * 10000 / 1000) + 1
FROM information_schema.columns t1
CROSS JOIN information_schema.columns t
LIMIT 10000;

查詢效能測試:t 表(10,000 筆)

GROUP BY 查詢

SELECT count(*), UserId , UserGroup FROM t GROUP BY UserId;
SELECT count(*), UserId, GROUP_CONCAT(UserId), UserGroup, GROUP_CONCAT(UserGroup) FROM t GROUP BY UserId;

查詢特定值所需時間

SELECT * FROM t WHERE UserId = 1049 AND UserGroup = 11;
-- 花費時間:4.516

增加索引後

ALTER TABLE `t` ADD INDEX `UserId` (`UserId`);
-- 查詢時間:1.938 秒 → 0.000

測試其他索引組合

  • 刪除 UserId 索引
  • 保留 UserGroup 索引 → 查詢反而變慢(12.140 秒)
  • 增加複合索引:
ALTER TABLE `t` ADD INDEX `UserId_UserGroup` (`UserId`, `UserGroup`);
SELECT * FROM t WHERE UserId = 1049 AND UserGroup = 11;

查詢效能測試:t4 表(1.4 億筆)

無索引查詢

sql
コピーする編集するSELECT * FROM t4 WHERE UserId = 2423392 AND UserGroup = 38;
-- 花費時間:50

加入索引後查詢

SELECT * FROM t4 WHERE UserId = 2423392 AND UserGroup = 38;
-- 花費時間:50

刪除 UserId 索引,再增加 UserGroup

ALTER TABLE `t4` ADD INDEX `UserGroup` (`UserGroup`);
-- 查詢同樣降至 0

加入複合索引:

ALTER TABLE `t4` ADD INDEX `UserGroup_UserId` (`UserGroup`, `UserId`);

使用 EXPLAIN 分析查詢計劃

條件:UserGroup + UserId

EXPLAIN SELECT * FROM t4 WHERE UserGroup = 38 AND UserId = 2423392;
raw-image

單一條件查詢

僅 UserGroup

EXPLAIN SELECT * FROM t4 WHERE UserGroup = 38;
-- 預估 rows:5642904

僅 UserId(無索引)

EXPLAIN SELECT * FROM t4 WHERE UserId = 2423392;
-- rows: 139,000,000(使用全表掃描)

資料與索引體積比較

資料大小索引大小5647.00MB2831.98MB


為什麼我會做這個?

其實就是一個開發者的煩惱:

  • 為什麼查詢那麼慢?
  • 哪種索引最好用?
  • 實際建資料試一下到底差多少?

與其紙上談兵,不如自己做個測試。


如果你也想試試

這份測試你也可以自己重現,只要準備好 MySQL Workbench,匯入上述 SQL 檔案並嘗試加入各種索引即可觀察查詢時間的差異。

這是個很好的練習,也適合拿來教學用來解釋「索引為什麼重要」。

如果你想直接下載或參考這份測試程式,歡迎看我的 GitHub:

bill86854238/database-index


歡迎交流

如果你也做過類似測試,或有自己觀察到的 index 效能經驗,歡迎留言交流分享:

你平常怎麼設計複合索引?遇過哪些「加了 index 反而變慢」的案例呢?

也許下一次的測試,就是解決這些問題的起點 🙌

留言
avatar-img
留言分享你的想法!
avatar-img
麟幻的沙龍
2會員
17內容數
軟體、旅遊分享
麟幻的沙龍的其他內容
2025/09/02
Chrome擴充功能「蝦皮賣家記錄器」讓您輕鬆標記蝦皮賣家評價,避免踩雷!此工具支援一鍵標記好評、避開、備註,並能高亮顯示賣家名稱及提供警告提示。資料同步到您的Google帳號,方便在不同裝置上使用。立即下載體驗更安全的蝦皮購物流程!
2025/09/02
Chrome擴充功能「蝦皮賣家記錄器」讓您輕鬆標記蝦皮賣家評價,避免踩雷!此工具支援一鍵標記好評、避開、備註,並能高亮顯示賣家名稱及提供警告提示。資料同步到您的Google帳號,方便在不同裝置上使用。立即下載體驗更安全的蝦皮購物流程!
2025/08/26
這篇文章介紹一個利用 Google Apps Script 從開眼電影網抓取電影上映資訊,並自動加入 Google Calendar 的工具 movie-calendar-sync。
2025/08/26
這篇文章介紹一個利用 Google Apps Script 從開眼電影網抓取電影上映資訊,並自動加入 Google Calendar 的工具 movie-calendar-sync。
2025/08/12
這個 Python 腳本工具可以自動將圖片資料夾轉換成 PDF 檔案,支援 JPG 和 PNG 格式,自動排序、命名、補零、以及簡體轉繁體,方便使用者整理漫畫或其他圖片檔案。
2025/08/12
這個 Python 腳本工具可以自動將圖片資料夾轉換成 PDF 檔案,支援 JPG 和 PNG 格式,自動排序、命名、補零、以及簡體轉繁體,方便使用者整理漫畫或其他圖片檔案。
看更多
你可能也想看
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
已經存在在table裡面的那些record做更新。 ※ 語法 UPDATE [LOW_PRIORITY] [IGNORE] table_name SET column_name1 = expr1, column_name2 = expr2, … [WHERE
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
Thumbnail
這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News