索引的认识

目录

一、索引的介绍

       介绍

       为什么要引入索引:

       索引的使用场景:

二、索引的优缺点

三、索引的类别

1、普通索引

2、唯一索引

3、主键索引

4、组合索引

5、全文索引

四、索引的失效与生效

五、聚集索引和非聚集索引的区别(MYSQL)

一、从物理存储的方式来进行区别的

二、底层数据结构从数据检索来区别:

三、关于聚集索引和非聚集索引的几个问题

一、索引的介绍

       介绍

             索引类似于书本字典的目录;帮助MySQL高效获取数据的数据结构。

       为什么要引入索引:

                ① 提高查询效率,尽量避免全表扫描;
                ② 索引本身也很大,要根据情况添加索引(数据量较少时,添加索引可能比不添加索引更占空间);
                 ③ 索引往往以索引文件的形式存储在磁盘上。

       索引的使用场景:

  1.                 一、应创建索引的场景:
            
                  1、经常使用在where子句上的列;
                          2、经常需要排序的列;
                          3、经常需要根据范围搜索;
                          4、经常用在连接的列:外键
                          5、作为主键的列;
                          6、经常需要搜索的列;
                    二、不应该创建索引的场景:
                          1、很少搜索的列;
                          2、具有很少数据值的列;
                          3、定义为text、image的列,因为这些列数据量相当大;
                         4、对修改性能远大于搜索性能时,因为当增加索引时,会提高搜索性能,但是会降低修改性能;

二、索引的优缺点

        优点:
                1、提高数据的检索效率,降低数据库的IO成本;
                2、通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

        缺点:
                1、索引也是一张表,保存了主键和索引字段,指向实体表的记录,所以索引列也要占空间;
                2、索引提高查询速度,但会降低更新速度,原因是更新索引列时,会动态更新索引;
                3、索引只是提高效率的一个因素,大数据量时,需要建立最优秀的索引或者优化查询语句,索引是根据不同业务场景进行调整的。

三、索引的类别

        Mysql主要的索引类型:普通索引、唯一索引、主键索引、组合索引、全文索引

1、普通索引

         是最基本的索引,值可以为空,仅加速查询。
        (1)创建索引:create index index_name on table(column(length));
          (2)   修改表结构的方式添加索引:alter table table_name add index index_name on (column(length));
          (3)   删除索引:drop index index_name on table;

2、唯一索引

        唯一索引与普通索引类似,不同的是:索引列的值必须唯一,允许有空值。如果是组合索引
则列值的组合必须唯一。简单来说:唯一索引是加速查询+列值唯一(可以有null)。
        (1)创建唯一索引:create unique index indexName on table(column(length));
          (2)   修改表结构:alter table table_name add unique indexName on (column(length));

3、主键索引

        主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
        简单来说:主键索引是加速查询+列值唯一(不能有null)+表中只有一个。
        (1)一般是在建表的时候创建主键索引:
                create table mytable(id int not null,username varchar(20) not null,primary key(id));

4、组合索引

        组合索引指在多个字段上创建的索引,查询条件中只有使用了创建索引时的第一个字段,索引才会被使用。注意:使用组合索引时遵循最左前缀集合。组合索引时多列值组成的一个索引,专门用于组合搜索,效率大于索引合并。
        (1)创建索引:alter table tableName add index name_name_age (name,age,city);

5、全文索引

        ①全文索引主要用来查找文本中的关键字,而非直接与索引中的值比较;
        ②目前只有char、vatchar、text列上可以创建全文索引;
        ③数据量大时,先将数据放入没有全局索引的表,然后再用create index创建全文索引优于先为表创建全文索引,然后再写入数据;
        (1)创建表的全文索引:
                CREATE TABLE `table`
                        ( `id` int(11) NOT NULL AUTO_INCREMENT ,
                          `title` char(255) CHARACTER NOT NULL ,
                           `content` text CHARACTER NULL ,
                           `time` int(10) NULL DEFAULT NULL ,
                            PRIMARY KEY (`id`),
                            FULLTEXT (content) );
        (2)修改表结构添加全文索引: alter table article add FULLTEXT index_content(content);
        (3)直接创建索引:create FULLTEXT index_content on article(content);

1.添加PRIMARY KEY(主键索引):ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

2.添加UNIQUE(唯一索引):ALTER TABLE `table_name` ADD UNIQUE (`column`)

3.添加INDEX(普通索引):ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

4.添加FULLTEXT(全文索引):ALTER TABLE `table_name` ADD FULLTEXT (`column`)


注意:Mysql的索引结构主要包括:BTree索引,Hash索引,full-text索引,R-Tree索引
           如果么有特别指明,都是指B+树结构的索引;
           InnoDB存储引擎中的B+树索引是由二叉查找树、平衡二叉树和B树这三种数据结构演化过来的。

四、索引的失效与生效

        1、like 模糊查询 前模糊或者 全模糊不走索引;
        2、or 条件中只要有一个字段没有索引,该语句就不走索引;
        3、使用 union all 代替 or 这样的话有索引例的就会走索引;
        4、in 走索引,not in 不走索引;
        5、is null 走索引,is not null  不走索引;
        6、!=、<> 不走索引;
        7、隐式转换-不走索引(name 字段为 string类型,这里123为数值类型,进行了类型转换,所以不走索引,改为 '123' 则走索引);
        8、函数运算-不走索引;
        9、and 语句,多条件字段,最多只能用到一个索引,如果需要,可以建组合索引;
        如果查看执行计划分析是否使用索引?

         PL_SQL(oracle):
         1、使用执行语句:EXPTAIN PLAN EOR 执行sql
         2、接着执行:SELECT * FROM TABLE (DBMS XPLAN.DISPLAY);
                或者直接 选中需要查询的SQL语句,按快捷键 F5 即可查看执行计划。

五、聚集索引和非聚集索引的区别(MYSQL)

一、从物理存储的方式来进行区别的

聚集索引也叫聚簇索引

① 聚集索引和聚簇索引不是一种索引类型,而是物理存储的方式而已;
② InnoDB默认数据结构是聚簇索引,而MyISAM是非聚簇索引;
如图所示:实际上是从物理存储的方式来进行区别的,分别为InnoDB和MyISAM的物理存储

① 聚集索引的物理存储有  表结构   和   表索引+数据 两个文件由于索引和数据聚集在同一文件中,所以称为聚集索引
② 非聚集索引的物理存储有 表结构 和 表数据  和 表索引三个文件;由于索引和数据没有被聚集在同一文件中,所以称为非聚集索引

二、底层数据结构从数据检索来区别:

聚集索引:
① InnoDB的数据文件.frm和数据文件.ibd,其中.ibd中存放的是数据和索引信息是存放在一起的;
② 表的数据行都存放在索引树的叶子节点中;
③ 索引和数据保存在同一个B-Tree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快。

非聚集索引:
① MyISAM的索引文件.MYI和数据文件.MYD是分开存储的;
② 叶子节点中保存的实际上是指向存放数据块的指针;
③ 非聚集索引需要先查询一遍索引文件,得到索引,根据索引获取数据。

三、关于聚集索引和非聚集索引的几个问题

1、在主键上创建聚集索引的表插入数据为什么比主键上创建非聚集索引表要慢?

        由于有主键唯一性的约束,所以需要保证插入的数据没有重复;
        聚集索引由于索引叶节点就是数据页,所以想检查主键的唯一性,需要遍历所有数据节点才行;但非聚集索引不同,由于非聚集索引上包含了主键值,所以查主键唯一性,只需要遍历所有的索引页就行(索引的存储空间比实际数据更少),这比遍历所有数据行减少了不少IO消耗。

2、在数据库中通过什么描述聚集索引与非聚集索引?

        索引是通过二叉树的形式进行描述的;
        聚集索引和非聚集索引的区别是:
                聚集索引的叶节点就是最终的数据节点;
                非聚集索引的叶节点仍是索引节点,但它有一个指向最终数据的指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/148151.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PHP 论文发表管理系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp

一、源码特点 PHP 论文发表管理系统是一套完善的web设计系统mysql数据库 &#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 php 论文发表系统1 代码 https://download.csdn.net/download/qq_412213…

C# Onnx 轻量实时的M-LSD直线检测

目录 介绍 效果 效果1 效果2 效果3 效果4 模型信息 项目 代码 下载 其他 介绍 github地址&#xff1a;https://github.com/navervision/mlsd M-LSD: Towards Light-weight and Real-time Line Segment Detection Official Tensorflow implementation of "M-…

【LeetCode:2656. K 个元素的最大和 | 贪心+等差数列】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

sql查询结果跟in传入参数顺序一致

Orcle、postgresql、td-sql中可以使用如下语句 select namefrom tbl_user_infowhere id in (4,3,1)order by instr(4,3,1,id);查询结果&#xff1a;

2023.11.14-hive的类SQL表操作之,4个by区别

目录 1.表操作之4个by,分别是 2.Order by:全局排序 3.Cluster by 4.Distribute by :分区 5. Sort by :每个Reduce内部排序 6.操作练习 步骤一.创建表 步骤二.加载数据 步骤三.验证数据 1.表操作之4个by,分别是 order by 排序字段名 cluster by 分桶并排序字段名 dis…

Golang实现一个一维结构体,根据某个字段排序

package mainimport ("fmt""sort" )type Person struct {Name stringAge int }func main() {// 创建一个一维结构体切片people : []Person{{"Alice", 25},{"Bob", 30},{"Charlie", 20},{"David", 35},{"Eve…

Spring-boot Mybatis-plus 实战应用

文章目录 前言一、springBoot 集成mybatis-plus1.1 maven 引入依赖&#xff1a;1.2 配置数据源&#xff1a;&#xff1a; 二、使用:2.1 mysql 打印执行的sql 设置&#xff1a;2.2 分页查询&#xff1a;2.3 条件构造器&#xff1a;2.3.1 QueryWrapper 查询&#xff1a;2.3.2 Upd…

Linux软硬链接

文章目录 &#x1f40b;1. 建立软硬链接现象&#x1f420;2. 软硬链接&#x1fab8;2.1 软链接&#x1fab8;2.2 硬链接 &#x1f426;3. 应用场景&#x1fab9;3.1 软链接应用场景&#x1fab9;3.2 硬链接应用场景 &#x1f40b;1. 建立软硬链接现象 我们这里给file.txt建立软…

手机-电脑互传软件:在 Windows 上安装和使用 Localsend 的完整指南

引言&#xff1a; Localsend 是一个简单而强大的本地文件传输工具&#xff0c;它可以让您在本地网络中快速、安全地共享文件和文件夹。本文将介绍如何在 Windows 上安装和使用 Localsend&#xff0c;以便您可以轻松地在本地网络中共享文件。 电脑端安装&#xff1a; 下载&…

基于单片机的电子万年历(论文+源码)

1.系统设计 本次基于proteus仿真的电子万年历的设计&#xff0c;对功能设计如下&#xff1a; 整个系统可以实现显示年、月、日、吋、分、秒的信息显示。带有温度检测功能&#xff0c;检测范围为0-100℃。具有闹钟功能&#xff0c;可以通过按键设定闹钟时间&#xff1b;可以通…

【python】—— 控制语句和组合数据类型(其一)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真 本来打算今天出去跑一下 GPS&#xff0c;但是下雨&#xff0c;作罢 添加参考轨迹信息 以下三个功能包不需要修改&#xff1a; mrobot&#xff1a;在 Rviz 和 Gazebo 中仿真机器人cmd_to_mrobot&#xff1a;运动学解算&#…

冯诺依曼体系和操作系统简单介绍

冯诺依曼体系和操作系统简单介绍 冯诺依曼体系 输入设备&#xff1a;键盘&#xff0c;话筒&#xff0c;摄像头&#xff0c;usb&#xff0c;鼠标&#xff0c;磁盘/ssd&#xff0c;网卡等等输出设备&#xff1a;显示器&#xff0c;喇叭&#xff0c;打印机&#xff0c;磁盘&#…

Path Aggregation Network for Instance Segmentation(2018.9)

文章目录 Abstract1. IntroductionOur FindingsOur Contributions 3. Framework3.1. Bottom-up Path AugmentationMotivationAugmented Bottom-up Structure 3.2. Adaptive Feature PoolingMotivationAdaptive Feature Pooling Structure 3.3. Fully-connected FusionMask Pred…

如何从 iCloud 恢复永久删除的照片?答案在这里!

在数字时代&#xff0c;丢失珍贵的照片可能会令人痛苦。然而&#xff0c;了解如何从 iCloud 恢复永久删除的照片可以带来一线希望。无论是意外删除还是技术故障&#xff0c;本指南都提供了 2023 年的最新方法来找回您的珍贵记忆。发现分步解决方案并轻松重新访问您的照片库。不…

Linux Ubuntu系统中添加磁盘

在学习与训练linux系统的磁盘概念、文件系统等&#xff0c;需要增加磁盘、扩展现有磁盘容量等&#xff0c;对于如何添加新的磁盘&#xff0c;我们在“Linux centos系统中添加磁盘”中对centos7/8版本中如何添加、查看、删除等&#xff0c;作了介绍&#xff0c;而对Ubuntu版本中…

css技巧分享(优惠券缺角样式实现)

主要知识点&#xff1a;radial-gradient radial-gradient() CSS 函数创建一个图像&#xff0c;该图像由从原点辐射的两种或多种颜色之间的渐进过渡组成。它的形状可以是圆形或椭圆形。函数的结果是 数据类型的对象。这是一种特别的 。 .coupon{width: 190rpx;height: 194rpx;b…

腾讯滑块验证

不在同一起跑线&#xff0c;力所能及尽力就好。 之前的文章里介绍腾讯系列点选类型的验证&#xff0c;然后的话也是有时间去看了无感验证跟这个滑块验证&#xff0c;就放在一起来说说吧&#xff0c;之前的文章在这&#xff1a;TX验证码_逆向学习之旅的博客-CSDN博客 这个tdc_pa…

《使用EasyExcel在Excel中增加序号列的方法》

《使用EasyExcel在Excel中增加序号列的方法》 1、简介2、正文3、核心代码4、使用方法5、效果 1、简介 在处理Excel文件时&#xff0c;有时候需要为表格增加序号列。本文介绍了如何使用Java代码实现在Excel中增加序号列的功能&#xff0c;并提供了一个示例代码。 2、正文 在处理…

ping: www.baidu.com: Name or service not known解决办法

解决服务器无法ping通外网问题 1、问题描述&#xff1a; 配置了网卡信息&#xff0c;发现还是无法访问外网&#xff0c;并报ping: www.baidu.com: Name or service not known信息 2、问题原因&#xff1a; 这就是外网没开通好 3、解决方法&#xff1a; 修改网卡文件&#xff…