工具小筆記|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會員
13內容數
軟體、旅遊分享
麟幻的沙龍的其他內容
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
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
Thumbnail
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
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 的狀況嗎?有個更簡單好用的寫法推薦給你,來瞧瞧!
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
這邊統整了所有過去發表過關於 QUERY 函式的教學分享,希望可以方便你按照順序閱讀和練習。 QUERY 可以用來查詢、篩選、聚集、排序資料,還可以做張簡易的資料透視表,是我在 Google 試算表上做數據分析、製作報告、製作儀表板時最常用的函式之一,既方便又好用,誠心推薦!
Thumbnail
BigQuery 是 Google 推出的無伺服器資料倉儲方案,內建有查詢引擎(類似於 SQL),查詢引擎除了可以方便管理外,也能夠在短時間內對數 TB 的數據進行撈取。相較於其他的資料倉儲解決方案相比,它的成本較低,但如果你的資料量太大有可能成本還是超出你的預期
Thumbnail
BigQuery 是 Google 推出的無伺服器資料倉儲方案,內建有查詢引擎(類似於 SQL),查詢引擎除了可以方便管理外,也能夠在短時間內對數 TB 的數據進行撈取。相較於其他的資料倉儲解決方案相比,它的成本較低,但如果你的資料量太大有可能成本還是超出你的預期
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News