广告
返回顶部
首页 > 资讯 > 数据库 >数据库中的索引
  • 123
分享到

数据库中的索引

mysql 2023-09-02 15:09:17 123人浏览 八月长安
摘要

目录 一、什么是索引? 索引的实现原理 什么时候考虑添加索引? 索引的类型 二、为什么要有索引? 三、怎么用索引? 索引的创建和删除 怎么查看一条sql语句中使用了索引? 索引失效的情况以及对应解决方案 一、什么是索引? 索引是数据

目录

一、什么是索引?

索引的实现原理

什么时候考虑添加索引?

索引的类型

二、为什么要有索引?

三、怎么用索引?

索引的创建和删除

怎么查看一条sql语句中使用了索引?

索引失效的情况以及对应解决方案


一、什么是索引

索引是数据库表中的字段的索引,所谓的索引就是在表的字段上添加的,每个字段都可以添加索引来提高查找效率,也可以多个字段联合添加一个索引。

参考字典的实现,索引相当于字典的目录,通过目录缩小查找范围。

索引的实现原理

假设有一张用户表:t_user
 
    id(PK)                  name                        每一行记录在硬盘上都有物理存储编号
    ----------------------------------------------------------------------------------
    100                     zhangsan                    0x1111
    120                     lisi                               0x2222
    99                       wangwu                     0x8888
    88                       zhaoliu                       0x9999
    101                     jack                            0x6666
    55                       lucy                            0x5555
    130                     tom                            0x7777

提醒1:

在任何数据库当中主键上都会自动添加索引对象,id字段上自动有索引,因为id是主键。另外在Mysql当中,一个字段上如果有unique约束的话,也会自动创建索引对象。
 
提醒2:

在任何数据库当中,任何一张表的任何一条记录在实际硬盘存储上都有一个硬盘的物理存储编号。

提醒3:

不管索引存储在哪里,索引在mysql当中都是一个树的形式存在。(自平衡二叉树:B-Tree)

假如sql语句是:select * from t_user where id = 101;

条件是id = 101,mysql发现id字段上有索引对象,所以会通过索引对象进行查找:

101比100大,看右边

101比120小,看左边

定位到101,通过定位到的101得出对应的物理编号0x6666,就会转换sql语句成:

select * from t_user where 物理编号 = 0x6666;

直接通过物理编号0x6666定位到存储的记录

101                     jack                            0x6666,

返回给用户。

假如id字段没有索引的话,他会到id字段上,进行从上到下查找,直至找到101,效率很低。

什么时候考虑添加索引?

什么条件下,我们会考虑给字段添加索引呢?

  • 条件1:数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)
  • 条件2:该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。
  •     条件3:该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。
建议通过主键查询,建议通过unique约束的字段进行查询,效率是比较高的。

索引的类型

分单列索引、组合索引和全文索引

单列索引:

  1. 主键索引,数据库表的主键字段会自动创建索引。
  2. 唯一索引,当某个列添加了Unique约束,也会自动创建唯一索引,要求值必须是唯一的。
  3. 普通索引,给普通字段添加索引就是普通索引。

组合索引:

  1. 多个字段合起来创建一个索引,只有当查询条件中使用了组合索引的第一个字段,索引才会被使用,使用组合索引是遵循最左前缀原则。

CREATE INDEX index_id_name ON mytable(id,name);

二、为什么要有索引?

为了提高查询的效率。

三、怎么用索引?

索引的创建和删除

创建索引:

create index 要创建的索引名 on 要创建索引的表名(要创建索引的字段);

删除索引:

drop index 要删除的索引名 on 要删除的索引所在的表名;

怎么查看一条sql语句中使用了索引?

dept表:

解释这条sql语句:

EXPLaiN select * from dept where loc = '北京';

 rows = 5,表示遍历了5条,说明是全部都遍历查找比对,找loc = '北京',说明loc字段没有索引。

给loc字段添加索引:

create index locIndex on dept(loc);

再执行sql语句:

EXPLAIN select * from dept where loc = '北京';

 rows = 2,就是遍历了2条,说明loc字段的索引起作用了。

索引失效的情况以及对应解决方案

失效的第1种情况:
        select * from emp where ename like '%T';

        ename上即使添加了索引,也不会走索引,为什么?
            原因是因为模糊匹配当中以“%”开头了,mysql找不到。
            解决方案:尽量避免模糊查询的时候以“%”开始。这是一种优化的手段/策略。

失效的第2种情况:
        使用or的时候会失效,如果使用or那么要求or两边的条件字段都要有索引,才会走索引,如果or其中一边有一个字段没有索引,那么另一个字段上的索引也会失效。

        解决方案:

                不建议使用or,所以这就是为什么不建议使用or的原因。

                或使用uNIOn联合查询。

举例:

dept表,loc字段有索引,deptname字段没有索引

select * from dept where loc = '福建' or deptname = '信息部';

查询位于福建的或者信息部的部门信息

以上sql语句,由于deptname没有索引,会导致loc的索引失效,可以使用union联合查询:

select * from dept where loc = '福建'

union

select * from dept where deptname = '信息部';

这样loc字段的索引还是生效的。
 

失效的第3种情况:
        使用复合索引的时候,没有用到左侧的字段作为查找条件,索引失效
        什么是复合索引?
            两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。

        create index emp_job_sal_index on emp(job,sal);

索引正常:explain select * from emp where job = 'MANAGER';

索引失效:explain select * from emp where sal = 800;

失效的第4种情况:
        在where当中索引列参加了运算,索引失效。
        create index emp_sal_index on emp(sal);

索引正常:explain select * from emp where sal = 800;

索引失效:explain select * from emp where sal+1 = 800;

失效的第5种情况:
        在where当中索引列使用了函数

        ename字段有索引
        explain select * from emp where lower(ename) = 'smith';

来源地址:https://blog.csdn.net/weixin_52938172/article/details/125739105

您可能感兴趣的文档:

--结束END--

本文标题: 数据库中的索引

本文链接: https://www.lsjlt.com/news/391017.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库中的索引
    目录 一、什么是索引? 索引的实现原理 什么时候考虑添加索引? 索引的类型 二、为什么要有索引? 三、怎么用索引? 索引的创建和删除 怎么查看一条sql语句中使用了索引? 索引失效的情况以及对应解决方案 一、什么是索引? 索引是数据...
    99+
    2023-09-02
    mysql
  • 数据库索引
    索引(index)是帮助MySQL高效获取数据的数据结构。常见的查询算法:顺序查找、二分查找、二叉树查找、哈希散列、分块查找、B树。   1)哈希算法:就是把任意长度值(key)通过散列算法变成固定长度的key地址,通过这个地址进行访问的数...
    99+
    2017-04-03
    数据库索引
  • 数据库--索引
    索引索引是对数据库表中一个或多个列的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。没有索引的情况下,如果执行select * from ...
    99+
    2022-10-18
  • mysql数据库的索引
    day04  MySQL数据库的索引一、索引概述:    索引是由一张表中的某个列或多列组成,而创建索引的目的是为了更优化管理我们的数据库表,提升我们查询使...
    99+
    2022-10-18
  • MySQL数据库引擎和索引
    一、MySQL 数据库引擎:1. Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别。在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的...
    99+
    2022-10-18
  • mysql数据库的索引类型
    索引类型介绍:主键索引primary key() 要求关键字不能重复,也不能为null,同时增加主键约束 主键索引定义时,不能命名唯一索引unique index() 要求关键字不能重复,同时增加唯一约束普...
    99+
    2022-10-18
  • MySQL数据库的常用索引
    MySQL数据库的常用索引 本文关键字:数据库、MySQL、索引的作用、常用索引在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。 一、索引概述 1. 数据库检索 ...
    99+
    2022-01-24
    MySQL数据库的常用索引 数据库入门 数据库基础教程 数据库 mysql
  • MYSQL(一)数据库索引类型,索引优点
    索引在mysql中也叫做键(key),是存储引擎用于快速找到记录的一种数据结构。索引结构类型(常见有两种):1. B-Tree索引大多数mysql引擎都支持这种索引;  &nb...
    99+
    2022-10-18
  • 数据库知识扫盲,数据库索引
    存储引擎 早期存储引擎都是把数据库相关数据固化到磁盘的,在并发上每张表都是表锁, 后期的存储引擎(例如innodb,in-memory等)大多都是元数据在磁盘上,索引数据在内存中,在并发上每张表都是行锁 2、磁盘型数据库索引 数据库如一本...
    99+
    2016-02-02
    数据库知识扫盲,数据库索引
  • 数据库中索引有什么用
    这篇文章主要介绍数据库中索引有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据库索引的最大作用就是加快查询速度,它能从根本上减少需要扫表的记录行的数量,数据库索引就是数据库的...
    99+
    2022-10-18
  • mysql数据库索引用处
    本文主要给大家介绍mysql数据库索引用处,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下mysql数据库索引用处吧。    &n...
    99+
    2022-10-18
  • 数据库之索引模块
    索引模块除了是数据库最重要的模块之一,也是面试中最经常被问到的,关于索引模块常见问题如下: 为什么要使用索引 什么样的信息能成为索引 索引的数据结构 密集索引和稀疏索引的区别 为什么要使用索引: 数据...
    99+
    2022-10-18
  • MySQL数据库唯一索引
    引言:什么是索引 创建索引是指在某个表的一列或多列上建立一个索引,以便提高对表的访问速度。创建索引有3种方式,分别是1.创建表的时候创建索引、2.在已经存在的表上创建索引和使用3.ALTER TABLE语句来创建索引。 本文福利,莬费领...
    99+
    2023-09-06
    数据库 mysql sql qt教程 qt开发
  • 显示/查看 MySQL 数据库中的索引
    要查看索引,语法如下 -select *from information_schema.statistics where table_schema= yourDatabaseName;在这里,我使用数据库“web”。显示...
    99+
    2023-10-22
  • Redis在PHP应用中的数据库索引
    Redis是一款常用的内存数据库,它被广泛使用在各种语言和应用中,其中包括PHP。 PHP是一种使用广泛的Web编程语言,开发者在使用PHP编写Web应用程序时往往需要使用外部数据存储以及快速访问这些数据。而Redis的快速读写能力使得其成...
    99+
    2023-05-17
    PHP redis 数据库索引
  • 数据库中的触发器,索引 ,事务
    一.触发器 触发器是一种实施复杂数据完整性的特殊存储过程,在对表或视图执行update、insert或delete语句时自动触发执行,以防止对数据进行不正确、未授权或不一致的参数。 creat&n...
    99+
    2022-10-18
  • MySQL数据库中的键和索引的概念
    本篇内容主要讲解“MySQL数据库中的键和索引的概念”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL数据库中的键和索引的概念”吧!1.键的概念键:数据库中的键(key)又称为关键字,是关...
    99+
    2023-06-02
  • MySQL数据库的索引和事务
    一、前言本文将要详细介绍MySQL索引与事务的概念及原理,并初步了解MySQL数据库视图概念,简述数据库的存储过程。二、索引2.1索引的概念——什么是索引一般来说,一篇论文,或者说一本书,都有其目录,而目录...
    99+
    2022-10-18
  • 数据库建立索引的方法
    这篇文章主要介绍数据库建立索引的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,...
    99+
    2022-10-18
  • MySQL数据库中索引有什么用
    这篇文章将为大家详细讲解有关MySQL数据库中索引有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、MySQL索引简介索引是MySQL数据库为了加快数据查询的速度,给表中的某一个或者是某几个列添加...
    99+
    2023-06-22
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作