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;
複製代碼
查詢需求sql
索引定義 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 BTREEbash
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
)優化
最左匹配原則的含義是,Mysql匹配索引時按照聯合索引的最左 N 個字段,或者是字符串索引的最左 M 個字符。spa
若是能經過新增聯合索引、調整聯合索引的順序達到減小索引的效果,那就能夠優先考慮這個順序。code
覆蓋索引和核心原理很簡單,就是避免查詢過程當中再去經過主鍵索引搜索樹,減小回表次數,也就是減小磁盤IO訪問。索引
若是增長覆蓋索引能匹配到高頻需求,能夠優先考慮創建這個索引,同時要注意的是索引增長後第一會增大空間的消耗,其次會下降插入數據的性能(必定程度上經過讀寫分離可解決),但通常業務場景下上面兩點是能夠忍受的。ci
MySQL 5.6 引入的索引下推優化(index condition pushdown), 能夠在索引遍歷過程當中,對索引中包含的字段先作判斷,直接過濾掉不知足條件的記錄,減小回表次數。字符串
這個優化原則能夠類比覆蓋索引的原則來判斷,根據具體SQL分析具體優化的表現。it