索引的设计原则

索引的设计原则

索引是数据库中用来提高性能的最常用工具,只要是关系型数据库,索引都是查询最核心的关键
一个平台随着用户数量的增长,和业务的开展,表中的数据量达到几十甚至上百万的时候,SQL查询所花费的时间会很长,甚至超时出错,此时就需要用索引加速SQL查询,所有 MySQL 列类型都可以被索引,对相关列使用索引是提高 SELECT 操作性能的最佳途径。
索引是需要存储成索引文件保存到磁盘中的,因此对索引的使用是会涉及磁盘IO操作的。如果索引创建过多,使用不当,就会造成大量无用的磁盘IO操作,适得其反,良好的索引创建原则非常重要!而索引的设计要遵循哪些原则呢?

索引的设计可以遵循一些已有的原则,尽量考虑符合以下这些原则,便于提升索引的使用效率,更高效地使用索引。

第一条:搜索的索引列,不一定是所要选择的列。

这个原则的意思是指:我们要查询得到的目标列,不一定用的是目标列的索引。
换句话说,最适合索引的列是出现在 where子句中的列,或连接子句中指定的列,也就是过滤条件所在的列,而不是出现在 select关键字后的选择列表中的列。在这里插入图片描述

可以看到select的字段name并没有创建索引,而主键id默认创建主键索引的,查询的时候索引是在where后面生效的,在select后面是不生效的。对于一些经常需要放在where后面的字段,我们就需要给这个字段创建索引,比如密码字段需要经常放在where后面,给它创建索引代来的提升就很大。

第二条:使用惟一索引

考虑某列中值的分布。索引的列的基数越大,分布越松散,索引的效果越好。例如,存放出生日期的列具有不值,很容易区分各行。而用来记录性别的列,只含有“ M”和“F”,则对此列进行索引没有多大用处,因为不管搜索哪个值,都会得出大约一半的行。
在这里插入图片描述

explain列出了可能用到的索引和实际用的索引。可以看到虽然sex字段创建了索引,但是实际并没有用到。

第三条:使用短索引

如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,如果有一个 char(200)列,如果在前 10 个或 20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前10个或20个字符进行索引能够节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘 IO 较少,较短的值比较起来更快。更为重要的是,对于较短的键值,索引高速缓存中的块能容纳更多的键值,因此,MySQL 也可以在内存中容纳更多的值。这样就增加了找到行而不用读取索引中较多块的可能性。
在已经创建的表上添加索引:

CREATE [UNIQUE] INDEX 索引名 ON 表名(属性名(length) [ASC | DESC]);

第四条:利用最左前缀

在创建一个 n 列的索引时,实际是创建了 MySQL 可利用的 n 个索引。多列索引可起几个索引的作用,因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。

第五条:不要过度使用索引

索引不是“越多越好”,什么东西都用索引是错误的,索引也是需要存储维护的。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。在修改表的内容时,索引必须进行更新,有时可能需要重构,因此,索引越多,所花的时间越长。如果有一个索引很少利用或从不使用,那么会不必要地减缓表的修改速度。此外,MySQL 在生成一个执行计划时,要考虑各个索引,这也要花费时间。创建多余的索引给查询优化带来了更多的工作。索引太多,也可能会使 MySQL 选择不到所要使用的最好索引。只保持所需的索引有利于查询优化。

explain结果字段分析

  • select_type

simple:表示不需要union操作或者不包含子查询的简单select语句。有连接查询时,外层的查询为simple且只有一个。
primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即 为primary且只有一个。
union:union连接的两个select查询,除了第一个表外,第二个以后的表的select_type都是union。
union result:包含union的结果集,在union和union all语句中,因为它不需要参与查询,所以id字段为null。

  • table

显示查询的表名;
如果不涉及对数据库操作,这里显示null;
如果显示为尖括号就表示这是个临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生的;
如果是尖括号括起来<union M,N>也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集;

  • type

const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type就是
const。 ref:常见于辅助索引的等值查找,或者多列主键、唯一索引中,使用第一个列之外的列作为等值查找会出现;返回数据不唯一的等值查找也会出现。
range:索引范围扫描,常见于使用<、>、is null、between、in、like等运算符的查询中。
index:索引全表扫描,把索引从头到尾扫一遍;常见于使用索引列就可以处理不需要读取数据文件的查询,可以使用索引排序或者分组的查询。
all:全表扫描数据文件,然后在server层进行过滤返回符合要求的记录。
ref
如果使用常数等值查询,这里显示const;
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段;
Extra
using filesort:排序时无法用到索引,常见于order by和group by语句中。
using index:查询时不需要回表查询,直接通过索引就可以获取查询的数据

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_200_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值