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;

  • 查询列使用 !=、>、<等导致全表扫描。
    MySQL 索引规范_第1张图片
    MySQL 索引规范_第2张图片
    MySQL 索引规范_第3张图片
  • where属性使用函数和表达式会导致全表扫描。
    MySQL 索引规范_第4张图片
  • 联合索引,要满足最左匹配原则
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 = …,是否使用索引:使用
    MySQL 索引规范_第5张图片
  • 假设联合索引顺序(a,b,c),where a = … and b = …,是否使用索引:使用
    MySQL 索引规范_第6张图片
  • 假设联合索引顺序(a,b,c),where a > … and b = …,是否使用索引:否,当第一个索引没用到,后面索引也会失效。
    MySQL 索引规范_第7张图片

四、慢SQL查询优化办法

  • 不要使用select *from 的格式 :因为不需要的字段查询(有可能是个很大字段)查询会增加开销
  • 增加索引
  • explain查询执行计划:是否使用到索引

你可能感兴趣的:(MySQL)