ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL中的索引的深入理解

2021-01-08 17:03:52  阅读:198  来源: 互联网

标签:Hash 查询 索引 添加 深入 tbl MySQL select


索引

1. 什么是索引?有什么用?

  1. 索引相当于一本书的目录,通过目录可以快速的找到对应的资源。
  2. 在数据库方面,查询一张表的时候有两种检索方式:
    (1)全表扫描;
    (2)根据索引检索(效率极高);
  3. 索引为什么可以提高检索效率呢?
    最根本的原因是缩小了扫描的范围。
  4. 索引虽然可以提交检索效率,但是不能随意的添加索引,因为索引也是数据库当中的对象,也需要数据库不断维护,具有维护很高的维护成本。比如,表中的数据经常被修改这样就不适合添加索引,因为数据一旦修改,索引需要重新排序与维护。
  5. 添加索引是给某一个字段或者说是某一些字段添加索引。

2. 怎么创建索引对象,怎么删除索引对象?

  1. 创建索引对象:
    add index 索引名称 on 表名(字段名);
  2. 删除索引对象
    drop index 索引名称 on 表名

3. 什么时候考虑给字段添加索引?

  1. 条件字段添加索引对象:
    select * from tbl_test where a = 9000;此时如果需要查询的更快,就需要给字段a添加索引对象。
  2. 聚合函数对聚合的字段添加索引对象:
    select max(a) from tbl_test;此时如果需要查询的更快,就需要给字段a添加索引对象。
  3. 表的关联查询关联的字段需要添加索引对象:
    select a.a, b.a from tbl_test1 a left inner join tbl_test2 b on a.a = b.a;此时如果给字段a添加索引对象的话,若需要进行查询的数据量庞大,有上百万上千万的话,添加索引与没添加索引差的是几百秒。
  4. 在经常需要根据范围进行搜索的字段上添加索引对象:
    因为索引已经经过排序了,所以查询速度更快。
  5. 在经常需要排序的字段上添加索引对象:
    因为索引已经经过排序了,所以在查询时,可以利用索引的排序,加快排序的查询。
  6. 注意:索引可以在一些情况下加速查询,但是在某些情况下,会降低效率。
    因为索引只是提高效率的一个因素。如果该字段经常需要进行DML操作,就不建议对该字段添加索引,因为索引对象也需要经常维护。
  7. 在查询语句前面加上explain可以查看语句的执行效率。
    例如:explain select * from tbl_test where a = 10000;

4. 什么时候会自动添加索引?

注意:主键和具有unique约束的字段会自动添加索引,所以根据主键查询的效率就较高,所以尽量根据主键进行查询。

5. 索引的类型有哪些?分别有什么作用?

MySQL的索引类型有:normal、unique、fulltext、spatial

  1. normal:表示普通索引类型。
  2. unique:表示唯一索引类型。例如身份证号可以设置为唯一索引类型。
  3. fulltext:全文搜索的索引类型,fulltext用于搜索很长的一篇文章的时候,效果最好,用在普通一两行字的文本的时候,用fulltext与normal几乎没有区别。
  4. spatial:空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建。
  5. 注意:索引的类别由建立索引的字段的内容特性来决定,通常normal是最常见的。

6. 索引的方法有哪些?分别有什么作用?

MySQL的索引方法有:BTree、Hash

  1. BTree:B-Tree是最常见的索引类型,所有值(被索引的列)都是排过序的,每个叶节点到跟节点距离相等。所以B-Tree适合用来查找某一范围内的数据,而且可以直接支持数据排序(ORDER BY)。
  2. Hash:
    (1)仅支持"=",“IN"和”<=>"精确查询,不能使用范围查询:因为Hash索引比较的是进行Hash运算之后的Hash值,所以它只能用于等值的过滤,不能用于基于范围的过滤。
    (2)不支持排序:因为Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。
    (3)在任何时候都不能避免表扫描:因为Hash索引比较的是进行Hash运算之后的Hash值,所以即使查询满足某个Hash键值的数据记录,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
    (4)检索效率高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引。
    (5)只有Memory引擎支持显式的Hash索引,但是它的Hash是nonunique的,冲突太多时也会影响查找性能。Memory引擎默认的索引类型即是Hash索引,虽然它也支持B-Tree索引。

7. 索引的实现原理?

通过BTree缩小扫描范围,底层索引进行排序、分区,所以会携带数据在表中的“物理地址”,最终通过索引检索到数据之后,获取到关联的物理地址,通过物理地址定位表中的数据,效率很高。
例如:select name from tbl_test where name = ‘Tom’;
通过索引转换为:select name from tbl_test where 物理地址=数据的物理地址;

8. 索引的分类?

  1. 单一索引:给一个字段添加一个索引;
  2. 复合索引:给多个字段联合添加一个索引;
  3. 主键索引:当创建表的时候,主键会自动添加索引;
  4. 唯一索引:当创建表的时候,有unique约束的字段会自动添加索引;

9. 索引什么时候会失效?

  1. 列与列的对比:
    某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引
    select * from test where id=c_id;这种情况会被认为还不如走全表扫描。
  2. Like通配符前缀为%时:
    select name from tbl_test where name like ‘%明’;因为前匹配的情况下,执行计划会更倾向于选择全表扫描,所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。例如:select name from tbl_test where name like ‘张%’;

标签:Hash,查询,索引,添加,深入,tbl,MySQL,select
来源: https://blog.csdn.net/weixin_45645403/article/details/112336270

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有