工具小筆記|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;
vocus|新世代的創作平台

單一條件查詢

僅 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
麟製所
2會員
65內容數
軟體、旅遊分享
麟製所的其他內容
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
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
Thumbnail
這篇文章主要是介紹了SQL查詢效能調校的方法,針對索引最佳化做了整理和分享,並提供了一些注意事項和建議。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
Thumbnail
在用 QUERY 查詢資料時,你曾遇過在 WHERE 寫很多個 OR 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
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
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
※ 為什麼選擇SQLite? 安裝簡單:SQLite是一個零配置的資料庫,不需要複雜的設定和安裝過程。。 使用SQL語法。 設計選擇多元性(MySQL / SQLite):適合於小零件資料應用、嵌入式系統、物聯網設備。 ※ SQLite四大優點: 執行檔檔案很小:資料庫系統需要的磁碟空
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
Thumbnail
本文介紹了 MyISAM 和 InnoDB 儲存引擎原理的區別和比較,並從讀取效率和寫入效率、結構、任務以及操作等方面探討了兩者的差異。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News