MySQL联合索引以及索引顺序优化
生活随笔
收集整理的這篇文章主要介紹了
MySQL联合索引以及索引顺序优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
MySQL聯合索引以及索引順序優化
- 1. 環境準備
- 2. 測試驗證
1. 環境準備
-- 查看版本 ,5.7.19-17-log select VERSION();-- 創建表結構 CREATE TABLE `order_demo` (`ID` bigint(20) NOT NULL AUTO_INCREMENT,`B2C_ORD_ID` varchar(50) DEFAULT NULL COMMENT '銷售訂單號',`ORDER_NO` varchar(50) NOT NULL COMMENT '訂單號',`SKU_ID` varchar(50) DEFAULT NULL COMMENT '商品ID',`SKU_AMOUNT` decimal(14,2) DEFAULT NULL COMMENT '商品金額',`SKU_NUM` decimal(14,0) DEFAULT NULL COMMENT '商品數量',`COUNT_DATE` datetime DEFAULT NULL COMMENT '點擊時間',`COMMIT_DATE` datetime DEFAULT NULL COMMENT '下單時間',`THROW_SOURCE` varchar(10) DEFAULT NULL COMMENT '投放終端/推廣設備 P.PC端,W.無線',`PROMOTION_ID` varchar(100) DEFAULT NULL COMMENT '推廣計劃ID',`PROMOTION_NAME` varchar(255) DEFAULT NULL COMMENT '推廣計劃名稱',`PROMOTION_UNIT_ID` varchar(100) DEFAULT NULL COMMENT '推廣計劃ID',`PROMOTION_UNIT_NAME` varchar(255) DEFAULT NULL COMMENT '推廣單元名稱',`PROMOTION_CHANNEL` int(2) DEFAULT NULL COMMENT '推廣渠道 1.搜索廣告位 2.推薦廣告位',`PROVINCE` varchar(50) DEFAULT NULL COMMENT '省份',`CITY` varchar(50) DEFAULT NULL COMMENT '城市',`ORDER_TYPE` int(2) DEFAULT NULL COMMENT '訂單類型:1.直接訂單 2.間接訂單',`ORDER_STATUS` int(4) DEFAULT NULL COMMENT '訂單狀態 1.提交 2.成交',`USER_ID` bigint(20) DEFAULT NULL COMMENT '查詢用戶ID',`ISACTIVE` int(4) DEFAULT NULL COMMENT '是否有效 0.失效 1.有效',`IS_GIFT` int(2) DEFAULT NULL COMMENT '是否贈品 (0 非贈品 1 贈品)',`IS_USE_COUPON` int(2) DEFAULT NULL COMMENT '是否用券 (0 未用券 1 用券)',`COUPON_AMOUNT` decimal(14,2) DEFAULT NULL COMMENT '用券金額',PRIMARY KEY (`ID`),KEY `index_unit_id` (`PROMOTION_UNIT_ID`),KEY `index_count_date` (`COUNT_DATE`),KEY `index_promotion_id` (`PROMOTION_ID`),KEY `index_user_id` (`USER_ID`),KEY `idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8mb4;2. 測試驗證
-- 添加聯合索引 ALTER TABLE `order_demo` add index `idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`); -- 刪除索引 ALTER TABLE order_demo DROP INDEX `idx_USER_ID_COUNT_DATE`;-- SQL_ID:4972193622039785254 SELECT COUNT(1) FROM order_demo T WHERE T.USER_ID =428964304AND T.COUNT_DATE >='2020-11-30'AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY);-- 添加聯合索引前,表原來沒有聯合索引,只有單列索引COUNT_DATE,USER_ID SELECT COUNT(1) FROM order_demo T WHERE T.USER_ID =428964304 AND T.COUNT_DATE >='2020-11-30' AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY);id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null ALL index_count_date,index_user_id 5 100 Using where總結:沒走索引全表掃描-- 添加聯合索引后,添加聯合索引(`USER_ID`,`COUNT_DATE`) SELECT COUNT(1) FROM order_demo T WHERE T.USER_ID =428964304 AND T.COUNT_DATE >='2020-11-30' AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY);id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15 NULL 5 100 Using where; Using index總結:使用到了聯合索引idx_USER_ID_COUNT_DATE-- 驗證聯合索引順序問題,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查詢條件是`USER_ID`,`COUNT_DATE` SELECT COUNT(1) FROM order_demo T WHERE T.USER_ID =428964304 AND T.COUNT_DATE >='2020-11-30' AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY);id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15 NULL 5 100 Using where; Using index總結:條件語句與聯合索引順序一致,rang,走了該聯合索引。-- 驗證聯合索引順序問題,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查詢條件是`COUNT_DATE`,`USER_ID` SELECT COUNT(1) FROM order_demo T WHERE T.COUNT_DATE >='2020-11-30' AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY) AND T.USER_ID =428964304;id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null rang index_count_date,index_user_id,idx_USER_ID_COUNT_DATE idx_USER_ID_COUNT_DATE 15 NULL 5 100 Using where; Using index總結:條件語句與聯合索引順序顛倒,rang,走了該聯合索引。與條件順序一致的執行計劃完全一樣,說明mysql拿到sql語句并不是立即執行,而是優化后執行!!!僅限于5.7.19版本測試,其他版本未測試不做評論。-- 驗證聯合索引順序問題,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查詢條件是`COUNT_DATE` SELECT COUNT(1) FROM order_demo T WHERE T.COUNT_DATE >='2020-11-30' AND T.COUNT_DATE < DATE_ADD('2020-12-06',INTERVAL 1 DAY);id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null rang index_count_date idx_COUNT_DATE 6 NULL 5 100 Using where; Using index總結:走單列索引-- 驗證聯合索引順序問題,`idx_USER_ID_COUNT_DATE` (`USER_ID`,`COUNT_DATE`),查詢條件是`USER_ID` SELECT COUNT(1) FROM order_demo T WHERE T.USER_ID =428964304;id select_type table partitions type possible_keys key key_len ref rows filtered Extra 1 SIMPLE T null rang index_user_id,idx_USER_ID_COUNT_DATE index_user_id 9 NULL 14 100 Using index總結:走單列索引總結
以上是生活随笔為你收集整理的MySQL联合索引以及索引顺序优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript数组常用方法总结及使
- 下一篇: mysql expires_离expir