当前位置: 首页 > 科技观察

90%程序员面试都会用到的索引优化

时间:2023-03-12 12:20:37 科技观察

,更多的是关于索引,分以下几点来讲解(技术文):索引概述(什么是索引,索引的优缺点)索引的基本使用(创建索引)索引的基本原理(面试重点)索引的数据结构(B树、哈希)创建索引的原理(最重要的,面试必问!求收藏!)***如何删除一级或多级数据,索引概述1)什么是索引?索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一部分),其中包含指向数据表中所有记录的引用指针。更一般地说,索引相当于一个目录。你在用新华字典的时候,它会帮你撕目录,查某个字开头的成语只能从***页翻到***千页。疲劳的!把目录还给你,你可以快速定位!2)索引的优缺点:可以大大加快数据的检索速度,这也是创建索引的主要原因,并且通过使用索引,可以在查询过程中使用optimizationhider来提高系统的性能。但是,索引也有缺点:索引需要额外的维护成本;因为索引文件是一个单独的文件,数据的增、改、删都会对索引文件产生额外的操作,消耗额外的IO,会降低增/改/删的执行效率。二、索引的基本使用(真技术文)1)创建索引:(三种方式)第一种方式:第二种方式:使用ALTERTABLE命令增加索引:ALTERTABLE用于创建普通索引,UNIQUE索引或PRIMARYKEY索引。其中table_name是要建立索引的表名,column_list表示建立索引的列。当有多个列时,列之间用逗号分隔。索引名称index_name可以自己命名。默认情况下,MySQL会根据第一个索引列分配一个名称。此外,ALTERTABLE允许在单个语句中更改多个表,因此可以同时创建多个索引。第三种方式:使用CREATEINDEX命令创建CREATEINDEX为表添加普通索引或UNIQUE索引。(但是不能创建PRIMARYKEY索引)3.索引的基本原理(不要像其他文章那样废话一大堆)索引用来快速找到那些具有特定值的记录。如果没有索引,一般来说,执行查询时会遍历整个表。索引的原理很简单。就是把无序的数据变成有序的查询。1.对索引列的内容进行排序。2.对排序后的结果生成倒排表。地址链4.查询时,先获取倒排表的内容,然后取出数据地址链,从而获取具体数据4.索引数据结构(b树,hash)1)B树索引mysql通过存储引擎对于数据,基本上90%的人都用InnoDB。按照实现方式,目前InnoDB的索引只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用频率最高的索引类型,基本上所有的存储引擎都支持BTree索引。通常我们所说的索引指的是(B树)索引(实际上是用B+树实现的,因为mysql查看表索引时总是打印BTREE,所以简称为B树索引)查询方式:主键索引区:pi(关联存储数据的地址)通过主键查询,公共索引区:si(关联id的地址,再到上面的地址)。所以按主键查询,最快的B+树特性:1.)n个子树的节点包含n个关键字,不是用来保存数据的,而是用来保存数据索引的。2.)所有叶子节点包含所有关键字的信息和指向包含这些关键字的记录的指针,叶子节点本身按照关键字大小从小到大的顺序链接起来。3.)所有非终端节点都可以看作是索引部分,节点在其子树中只包含***(或最小)关键字。4.)在B+树中,数据对象的插入和删除只在叶子节点上进行。5.)B+树有2个头指针,一个是树的根节点,一个是最小key的叶子节点。2)哈希索引(很好的技术文章)简单来说,它类似于数据结构中简单实现的HASH表(哈希表)。我们在mysql中使用哈希索引时,主要是通过哈希算法(常见的哈希算法有直接寻址法、平方法、折叠法、除数余数法、随机数法),将数据库字段数据转换成固定的-lengthHash值,并与该数据的行指针一起存放在Hash表中对应的位置;如果发生Hash冲突(两个不同关键字的Hash值相同),则以链表的形式存储在对应的Hashkey下。当然这只是粗略的模拟。ps:关于数据结构,有兴趣深入的朋友可以关注我,查看【数据结构】专题,这里就不详细解释了。5.建立索引的原则(最重要的)索引虽然好,但不是强制使用。最好满足以下原则1)最左前缀匹配原则,复合索引很重要的原则,mysql会一直向右匹配,直到遇到范围查询(>,<,between,like)停止匹配,比如a=1andb=2andc>3andd=4如果建立(a,b,c,d)顺序索引,d是不使用索引的,如果索引为(a,b,d,c)可以使用,a、b、d的顺序可以任意调整。2)为经常作为查询条件的字段创建索引3)频繁更新的字段不适合创建索引4)不能有效区分数据的列不适合做索引列(比如性别,男女不详,at大多数三种,区分度太低)5)尽量扩展索引,不要新建索引。比如表中已经有a的索引,现在要增加(a,b)的索引,那么只需要修改原来的索引即可。6)用外键定义的数据列必须建立索引。7)对于那些很少参与查询的列,不要为重复值较多的列建立索引。8)不要为定义为文本、图像和位数据类型的列创建索引。***如何删除上面或上面的数据(真是不错的技术文章)关于索引:因为索引需要额外的维护成本,因为索引文件是一个单独的文件,所以当我们添加、修改、删除数据时,会对索引文件进行额外的操作,消耗额外的IO,会降低增/改/删的执行效率。因此,当我们删除数据库中的具体数据时,可以查看MySQL官方手册得知,删除数据的速度与创建索引的数量成正比。所以当我们要删除百万条数据时,可以先删除索引(此时需要三分钟左右),然后删除无用的数据(这个过程不到两分钟),删除完成后重新创建索引(此时数据比较少)创建索引也很快,大概十分钟左右。比起之前直接删除,肯定是快了很多,更何况如果删除被打断,所有的删除都会被回滚。那更是一个陷阱。今天,指数的讲解到此结束。重点是提到索引的基本原理和创建索引的原理是重点,基本的面试题一定要问!可以收集到很多的理解和感悟。