MySQL 索引規範

一、概述

MySQL的表設計中,常常會遇到添加索引列。索引的好處就是加快查詢,但是也會代來一定額外資源的開銷。如何規範設計索引,將幫助我們事半功倍。

二、索引設計規範

  • 不要再頻繁更新的字段使用索引
  • 區分度不高的列
  • 組合索引把區分度較高的列放在前面

三、使用索引注意的點

CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(255) NOT NULL COMMENT '商品名稱',
  `price` decimal(10,0) NOT NULL COMMENT '商品價格',
  `in_time` datetime NOT NULL COMMENT '入庫時間',
  `out_time` datetime NOT NULL COMMENT '出庫時間',
  PRIMARY KEY (`id`),
  KEY `idx_price` (`price`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

  • 查詢列使用 !=、>、<等導致全表掃描。
    在這裏插入圖片描述
    在這裏插入圖片描述
    在這裏插入圖片描述
  • where屬性使用函數和表達式會導致全表掃描。
    在這裏插入圖片描述
  • 聯合索引,要滿足最左匹配原則
CREATE TABLE `product` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `product_name` varchar(255) NOT NULL COMMENT '商品名稱',
  `price` decimal(10,0) NOT NULL COMMENT '商品價格',
  `in_time` datetime NOT NULL COMMENT '入庫時間',
  `out_time` datetime NOT NULL COMMENT '出庫時間',
  PRIMARY KEY (`id`),
  KEY `idx_pri_in_end` (`price`,`in_time`,`out_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
  • 假設聯合索引順序(a,b,c),where a = … and c = …,是否使用索引:使用
    在這裏插入圖片描述
  • 假設聯合索引順序(a,b,c),where a = … and b = …,是否使用索引:使用
    在這裏插入圖片描述
  • 假設聯合索引順序(a,b,c),where a > … and b = …,是否使用索引:否,當第一個索引沒用到,後面索引也會失效。
    在這裏插入圖片描述

四、慢SQL查詢優化辦法

  • 不要使用select *from 的格式 :因爲不需要的字段查詢(有可能是個很大字段)查詢會增加開銷
  • 增加索引
  • explain查詢執行計劃:是否使用到索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章