热门标签 | 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


推荐阅读
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • 2022年2月 微信小程序 app.json 配置详解:启用调试模式
    本文将详细介绍如何在微信小程序的 app.json 文件中启用调试模式(debug),并通过实际案例展示其配置方法和应用场景。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 使用jqTransform插件美化表单
    jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在Linux系统中避免安装MySQL的简易指南
    在Linux系统中避免安装MySQL的简易指南 ... [详细]
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社区 版权所有