美文网首页
索引建立场景

索引建立场景

作者: ryancao_b9b9 | 来源:发表于2020-04-25 10:40 被阅读0次

一、建立场景
既然索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引?
答案是否定的。因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL在运行时也要消耗资源维护索引,因此索引并不是越多越好。

二、不建议建索引的情况
1、表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了。(经验值2000)
2、索引的选择性较低。所谓索引的选择性(Selectivity),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:Index Selectivity = Cardinality / #T

三、索引建立技巧
1、选择性
选择性越高的索引价值越大(这是由B+Tree的性质决定的)
2、索引长度
索引key变短而减少了索引文件的大小和维护开销
案例:
以employees.employees表为例,表中已创建一个<emp_no>主键索引,那么如果我们想按名字搜索一个人,就只能全表扫描,如果频繁按名字搜索员工,这样显然效率很低,因此我们可以考虑建索引。
有两种选择,建<first_name>或<first_name, last_name>,看下两个索引的选择性:


first_name选择性.png first_name, last_name选择性.png

问题:
<first_name>显然选择性太低,<first_name, last_name>选择性很好,但是first_name和last_name加起来长度为30,有没有兼顾长度和选择性的办法?
方案:
用列的前缀代替整个列作为索引key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引key变短而减少了索引文件的大小和维护开销。
考虑用first_name和last_name的前几个字符建立索引,例如<first_name, left(last_name,n)>,看看其选择性:


left(last_name, 2).png left(last_name, 3).png left(last_name, 4).png

综上所述:first_name, left(last_name, 4)作为前缀索引可以实现选择性高、索引长度适中的目标,这个前缀索引建上:
ALTER TABLE employees.employees ADD INDEX 'first_name_last_name4' (first_name, last_name(4));
此时再执行一遍按名字查询,比较分析一下与建索引前的结果:


优化前.png
优化后.png

性能的提升是显著的,前缀索引兼顾索引大小和查询速度,但是其缺点是不能用于 ORDER BY 和 GROUP BY操作,也不能用于Covering index(即当索引本身包含查询所需全部数据时,不再访问数据文件本身)。

相关文章

  • 索引建立场景

    一、建立场景既然索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引?答案是否定的。因为索引虽然加快了查...

  • 创建索引,这些知识应该了解

    前言: 在 MySQL 中,基本上每个表都会有索引,有时候也需要根据不同的业务场景添加不同的索引。索引的建立对于数...

  • 干货:你不知道的mysql多列索引的建立和优化

    对于单列索引,没有太多的话题,但是对于多列索引的建立,一个好的多列索引能使用的场景应可以涵盖很多,减少其他不必要的...

  • 搜索引擎Lucene(4):索引的创建过程

    1、索引维护 创建索引的过程如下: 建立索引器 Indexwriter。 建立文档对象 Document。 建立信...

  • 联合索引-以及如何使用索引

    联合索引 建立索引的时候,尽量建立联合索引,即多个字段组成1个索引。因为如果针对单个字段建立索引的话,会造成索引过...

  • 索引创建-oracle

    索引,索引的建立、修改、删除建立索引 CREATE INDEX命令语法: CREATE INDEXCREATE [...

  • MySQL索引建立规则及优化

    概述     相信搭建都知道数据库的常见优化方式,就是建立索引;但是何时建立索引、那些字段需要建立索引,索引是否生...

  • 第22期:索引设计(组合索引适用场景)

    建立在多个列上的索引即组合索引(联合索引),适用在多个列必须一起使用或者是从左到右方向部分连续列一起使用的业务场景...

  • 10 两表优化案例

    创建表 SQL语句 在左表建立索引 在右表建立索引,删掉左表索引 在右表建立索引,type变为ref,rows优化...

  • mongodb索引

    先题几个问题 什么是索引? 如何建立索引? 如何选择建立索引的字段? 如何强制使用索引? 如何评估索引效率? 如果...

网友评论

      本文标题:索引建立场景

      本文链接:https://www.haomeiwen.com/subject/mjccwhtx.html