今天來用一個 usecase 講一下聯合索引,不是太專業但是讓念資料庫的朋友可以有個脈絡
然後不小心發現了一個 bug,就是小林coding裡面是 MySQL,可是前面選環境的時候是 postgres
後面看需求要不要來做調整,反正個人覺得兩個資料庫(甚至其他)背後原理知識不會差太多
CREATE TABLE test (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
ranks VARCHAR(1) NOT NULL,
score INT NOT NULL,
points INT NOT NULL
);
CREATE INDEX rank_score_points ON test (ranks, score, points);
這邊我們模擬了遊戲榜單,欄位
姓名name/排名rank/分數score/儲值點數points
不需要測試資料因為我們使用 explain 去觀察效能CREATE INDEX rank_score_points ON test (ranks, score, points);
這邊的索引設計上是用可以重複的一般聯合索引來做查詢加速
有用索引的測試
explain select * from test where ranks = 'A' and score > 300 and points < 5000;
這邊會查出
(1) type = range
(2) Extra = Using index
沒有走索引的測試
explain select * from test where score > 300 and points < 5000;
查出
type = ALL
Extra = Using where
為什麼會有這個差別,因為聯合索引「最左匹配索引」,篇幅怕太長我們下一篇講!