热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

实习学习数据库索引13

https:blog.csdn.netzhang_xiaomengarticledetails78218829索引的链接-----良心文章,深度解释索引https

https://blog.csdn.net/zhang_xiaomeng/article/details/78218829

索引的链接-----良心文章,深度解释索引

https://www.jb51.net/article/128327.htm深度好文

索引深度好文

本文给大家分享了90%程序员面试都用得上的索引优化,重点提一下,索引基本原理和创建索引的原则是重点,面试基本必问!大家可以收藏好多理解理解。下面来一起看看详细的介绍吧。

关于索引,分为以下几点来讲解(技术文):

  • 索引的概述(什么是索引,索引的优缺点)
  • 索引的基本使用(创建索引)
  • 索引的基本原理(面试重点)
  • 索引的数据结构(B树,hash)
  • 创建索引的原则(重中之重,面试必问!敬请收藏!)
  • 百万级别或以上的数据如何删除

一、索引的概述

1)什么是索引?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。更通俗的说,索引就相当于目录。当你在用新华字典时,帮你把目录撕掉了,你查询某个字开头的成语只能从第一页翻到第一千页。累!把目录还给你,则能快速定位!

2)索引的优缺点:

可以大大加快数据的检索速度,这也是创建索引的最主要的原因。,且通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。但是,索引也是有缺点的:索引需要额外的维护成本;因为索引文件是单独存在的文件,对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。

二、索引的基本使用(真技术文)

1)创建索引:(三种方式)

第一种方式:

第二种方式:使用ALTER TABLE命令去增加索引:

ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。

索引名index_name可自己命名,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

第三种方式:使用CREATE INDEX命令创建

CREATE INDEX可对表增加普通索引或UNIQUE索引。(但是,不能创建PRIMARY KEY索引)

三、索引的基本原理(不想像别的文章那样一大堆篇幅废话)

索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。

索引的原理很简单,就是把无序的数据变成有序的查询

      1、把创建了索引的列的内容进行排序

      2、对排序结果生成倒排表

      3、在倒排表内容上拼上数据地址链

      4、在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据

四、索引的数据结构(b树,hash)

1)B树索引

mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引)

查询方式:

主键索引区:PI(关联保存的时数据的地址)按主键查询,

普通索引区:si(关联的id的地址,然后再到达上面的地址)。所以按主键查询,速度最快

B+tree性质:

1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。

3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。

4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。

5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。

2)哈希索引(好技术文)

简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。当然这只是简略模拟图。

ps:关于数据结构,有兴趣深入的朋友可以关注我后查看【数据结构】专题,这里不做详细讲解。

五、创建索引的原则(重中之重)

索引虽好,但也不是无限制的使用,最好符合一下几个原则

1&#xff09; 最左前缀匹配原则&#xff0c;组合索引非常重要的原则&#xff0c;mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配&#xff0c;比如a &#61; 1 and b &#61; 2 and c > 3 and d &#61; 4 如果建立(a,b,c,d)顺序的索引&#xff0c;d是用不到索引的&#xff0c;如果建立(a,b,d,c)的索引则都可以用到&#xff0c;a,b,d的顺序可以任意调整。

2&#xff09;较频繁作为查询条件的字段才去创建索引

3&#xff09;更新频繁字段不适合创建索引

4&#xff09;若是不能有效区分数据的列不适合做索引列(如性别&#xff0c;男女未知&#xff0c;最多也就三种&#xff0c;区分度实在太低)

5&#xff09;尽量的扩展索引&#xff0c;不要新建索引。比如表中已经有a的索引&#xff0c;现在要加(a,b)的索引&#xff0c;那么只需要修改原来的索引即可。

6&#xff09;定义有外键的数据列一定要建立索引。

7&#xff09;对于那些查询中很少涉及的列&#xff0c;重复值比较多的列不要建立索引。

8&#xff09;对于定义为text、image和bit的数据类型的列不要建立索引。

百万级别或以上的数据如何删除&#xff08;真好技术文&#xff09;

关于索引&#xff1a;由于索引需要额外的维护成本&#xff0c;因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以&#xff0c;在我们删除数据库百万级别数据的时候&#xff0c;查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

  • 所以我们想要删除百万数据的时候可以先删除索引&#xff08;此时大概耗时三分多钟&#xff09;
  • 然后删除其中无用数据&#xff08;此过程需要不到两分钟&#xff09;
  • 删除完成后重新创建索引(此时数据较少了)创建索引也非常快&#xff0c;约十分钟左右。
  • 与之前的直接删除绝对是要快速很多&#xff0c;更别说万一删除中断,一切删除会回滚。那更是坑了。

常用的数据库索引优化语句

使用如下的表tb_test作为示例进行说明&#xff1a;

?

1

2

3

4

5

6

7

8

9

10

create table tb_test

(

id int not null,

age int not null,

name varchar(30) not null,

addr varchar(50) not null

);

create unique index idx1_tb_test on tb_test(id);

create index idx2_tb_test on tb_test(name);

create index idx3_tb_test on tb_test(addr);

索引优化建议

1.对索引列进行计算

例如&#xff0c;我们想要将表tb_test中id大于100的数据记录中的age和name查找出来。

正确的SQL语句是&#xff1a;

?

1

select age,name from tb_test where id > 1*100;

不建议采用的SQL语句是&#xff1a;

?

1

select age,name from tb_test where id/100 > 1;

2.对索引列进行拼接

例如&#xff0c;我们想要将表tb_test中name为“zhou”、addr为“CQ”的记录中的id和age查找出来。

正确的SQL语句是&#xff1a;

?

1

select id,age from tb_test where name&#61;&#39;zhou&#39; and addr&#61;&#39;CQ&#39;;

不建议采用的SQL语句是&#xff1a;

?

1

select id,age from tb_test where concat(name,&#39; ‘,addr) &#61; ‘zhou CQ&#39;;

3.在索引列上is null或is not null的使用

例如&#xff0c;我们想要将表tb_test中id大于等于“0”的记录中的age查找出来。

正确的SQL语句是&#xff1a;

?

1

select age from tb_test where id >&#61; 0;

不建议采用的SQL语句是&#xff1a;

?

1

select age from tb_test where id is not null;

4.在索引列上or的使用

例如&#xff0c;我们想要将表tb_test中id等于101或102的记录中的age和name查找出来。

正确的SQL语句(使用union)是&#xff1a;

?

1

select age,name from tb_test where id &#61; 101 union select age,name from tb_test where id &#61; 102;

不建议采用的SQL语句(使用or)是&#xff1a;

?

1

select age,name from tb_test where id &#61; 101 or id &#61; 102;

5.尽可能避免索引列在like的首字符使用通配符

例如&#xff0c;我们想要将表tb_test中name匹配“zho”的记录中的id和age查找出来。

正确的SQL语句是&#xff1a;

?

1

select id,age from tb_test where name like ‘zho%&#39;;

不建议采用的SQL语句是&#xff1a;

?

1

select id,age from tb_test where name like ‘%ho%&#39;;

6.复合索引的使用

如果我们建立的索引是复合索引&#xff0c;那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引。

例如&#xff0c;我们在表tb_test上新建了如下索引&#xff1a;

?

1

create index idx4_tb_test on tb_test(id,name,addr);

以上索引idx4_tb_test相当于建立了index(id)、index(id,name)、index(id,name,addr) 这3个索引。在SQL语句的where条件中单独使用name或addr时不会使用到该索引&#xff0c;必须使用id时才会使用到该索引。

在我们编写的SQL语句中&#xff0c;不正确地使用索引列可能会导致索引不被使用&#xff0c;而进行全表扫描&#xff0c;极大地降低了数据库的性能。因此&#xff0c;学习正确的索引的使用方法实在是很有必要的。

今天&#xff0c;索引的讲解就到这里&#xff0c;重点提一下&#xff0c;索引基本原理和创建索引的原则是重点&#xff0c;面试基本必问&#xff01;大家可以收藏好多理解理解。

总结

以上就是这篇文章的全部内容了&#xff0c;希望本文的内容对大家的学习或者工作具有一定的参考学习价值&#xff0c;如果有疑问大家可以留言交流&#xff0c;谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

  • MySQL 索引分析和优化
  • mysql性能优化之索引优化
  • SQL优化基础 使用索引&#xff08;一个小例子&#xff09;
  • MySQL索引背后的之使用策略及优化(高性能索引策略)
  • Mysql limit 优化&#xff0c;百万至千万级快速分页 复合索引的引用并应用于轻量级框架
  • MySQL 联合索引与Where子句的优化 提高数据库运行效率
  • MySQL中索引优化distinct语句及distinct的多字段操作
  • Mysql使用索引实现查询优化
  • MySQL Order By索引优化方法
  • 搜索引擎优化《SEO教程2007版》下载

原文链接&#xff1a;http://news.51cto.com/art/201711/557665.htm


推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
逺續ken_372
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有