MySQL索引心得
阿新 • • 發佈:2020-06-24
場景分析
訂單表
CREATE TABLE test_innodb.torder (
`id` int(11) NOT NULL,order_no varchar(100) NOT NULL,order_status varchar(100) NOT NULL,order_create_time DATETIME NOT NULL,order_amount BIGINT NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;
複製程式碼
查詢需求
- 查詢最近(30天)內某個訂單狀態的所有訂單
- 統計處於某個訂單狀態的所有訂單
- 根據交易單號查詢訂單的狀態
索引定義
KEY order_status-order_no
(order_status
,order_no
),KEY order_status-order_create_time
(order_status
,order_create_time
),UNIQUE KEY order_no
(order_no
) USING BTREE
市民表
CREATE TABLE `tuser` (
`id` int(11) NOT NULL,`id_card` varchar(32) DEFAULT NULL,`name` varchar(32) DEFAULT NULL,`age` int(11) DEFAULT NULL,`ismale` tinyint(1) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB
複製程式碼
查詢需求
- 根據市民身份證號查詢所有資訊
- 根據市民的身份證號查詢他的姓名
索引定義
KEY id_card
(id_card
),KEY name_age
(name
,age
)
優化原則:
1. 最左匹配原則
最左匹配原則的含義是,Mysql匹配索引時按照聯合索引的最左 N 個欄位,或者是字串索引的最左 M 個字元。
如果能通過新增聯合索引、調整聯合索引的順序達到減少索引的效果,那就可以優先考慮這個順序。
2. 覆蓋索引
覆蓋索引和核心原理很簡單,就是避免查詢過程中再去通過主鍵索引搜尋樹,減少回表次數,也就是減少磁碟IO訪問。
如果增加覆蓋索引能匹配到高頻需求,可以優先考慮建立這個索引,同時要注意的是索引增加後第一會增大空間
3. 索引下推
MySQL 5.6 引入的索引下推優化(index condition pushdown), 可以在索引遍歷過程中,對索引中包含的欄位先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。
這個優化原則可以類比覆蓋索引的原則來判斷,根據具體SQL分析具體優化的表現。