MySQL基础(六)-索引(index)详解

这篇具有很好参考价值的文章主要介绍了MySQL基础(六)-索引(index)详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是索引?

二、索引的实现原理

三、在MySQL中,主键、unique字段上会自动添加索引。

四、索引的创建与删除

创建索引:

删除索引:

五、查看SQL语句是否使用了索引

六、索引的失效

失效的第一种情况:模糊匹配当中以“%”开头

失效的第二种情况:使用or

失效的第三种情况:使用复合索引时,没有使用左侧的列查找

失效的第四种情况:在where当中索引列列添加了运算

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

七、索引的分类


一、什么是索引?

索引实在数据库表的字段上添加的,是为了提高查询效率存在的一种数据结构

一张表的一个字段可以添加一个索引,当然,多个字段也可以联合起来添加索引。

索引相当于一本书的目录,是为了缩小扫描范围而存在的一种机制。

比如我们通过字典查找某个汉字的时候,有两种方法:

第一种方法:

        一页一页找,知道找到我们需要的内容为止。这种查找方式属于全字典扫描,效率比较低。

第二种方法:

        先通过目录(索引)去定位一个大概的位置,然后直接定位到这个位置,做局域性扫描,缩小扫描的范围,快速的查找。这种查找方式属于通过索引检索,效率较高。

如:

mysql 索引,# MySQL,sql,数据库

         因为添加了查询条件"name=jack",所以我们会去name字段上扫描。

        如果name字段上没有添加索引(目录),或者说没有给name字段创建索引,MySQL会进行全扫描。会将name字段上的每一个值都比对一遍,效率较低。

MySQL在查询方面主要就是两种方式:

        第一种方式:全表扫描

        第二种方式:根据索引检索

注意:

        在实际中,字典的目录是排序的,按照 a b c ....进行排序。因为只有排序了才有区间查找的概念。缩小扫描范围实际就是扫描某个区间。

        在MySQL数据库中索引也是需要索引的,并且这个索引的排序和TreeSet数据结构相同。在MySQL中索引是一个B-Tree数据结构

        遵循左小右大原则存放,采用中序遍历方式遍历取数据。

二、索引的实现原理

注意1:在任何数据库当中,主键上都会自动添加索引对象。另外在MySQL中,一个字段上如果有unique约束的话,也会自动创建按索引对象。

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

注意3:在MySQL中,索引是一个单独的对象。不同的存储引擎以不同的形式存在。但不过关索引存储在哪里,索引在MySQL中都是以一个树的形式存在(自平衡二叉树:B-Tree)

二叉树数据结构的弊端:

        当极端情况下,数据递增插入时,会一直向右插入,形成链表,查询效率会降低。

MySQL中常用的索引数据结构有:

  • BTree索引(Myisam普通索引)
  • B+Tree索引(InnoDB普通索引)
  • Hash索引(memory存储引擎)等等
储存引擎 存储位置
MyISAM .MYI
InnoDB tablespace
MEMORY 内存

mysql 索引,# MySQL,sql,数据库

索引的实现原理:缩小扫描范围,避免全表扫描。

索引的优势:

        提高数据检索的效率,降低数据库的IO成本。

        通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

索引的劣势:

        索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。

        再索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL不仅要更新数据,还需要保存一下索引文件。每次更新添加了索引列的字段,都会区调整因为更新带来的简直变化后的索引的信息。

三、索引的使用场景

在MySQL中,主键、unique字段上会自动添加索引。

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

条件1:数据量庞大

条件2:该字段经常出现在where的后面,以条件的形式存在。即这个字段总是被扫描。

条件3:该字段很少的DML操作。因为DML之后索引需要重新排序

建议不要随意添加索引,因为索引也是需要维护的。太多的话反而会降低系统的性能。

建议通过主键查询,通过unique约束的字段进行查询,效率较高。

不推荐建立索引:

1、表记录太少

2、经常增删改的表

3、where条件里用不到的字段不建立索引

四、索引的创建与删除

创建索引:

给emp表的ename字段添加索引,起名:emp_ename_index

create index emp_ename_index on emp(ename);
alter table emp add index emp_ename_index(ename);

删除索引:

将emp表上的emp_ename_index索引对象删除

drop index emp_ename_index on emp;

五、查看SQL语句是否使用了索引 - explain

使用explain关键字可以用来分析查询语句或者表的结构的性能瓶颈。其作用:

  1. 表的读取顺序
  2. 哪些索引可以使用
  3. 数据读取操作的操作类型
  4. 哪些索引被实际使用
  5. 表之间的引用
  6. 每张表有多少行被优化器查询
mysql> explain select * from test where id=1;
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | test  | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    7 |    14.29 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

# 给id字段添加索引
mysql> create index id_index on test(id);
Query OK, 0 rows affected (0.08 sec)
Records: 0  Duplicates: 0  Warnings: 0


mysql> explain select * from test where id=1;
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
|  1 | SIMPLE      | test  | NULL       | ref  | id_index      | id_index | 5       | const |    4 |   100.00 | NULL  |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

mysql 索引,# MySQL,sql,数据库

mysql 索引,# MySQL,sql,数据库

 扫描7条记录,说明没有使用索引。

type=ALL:未使用索引

type=ref:使用索引

explain重要字段名

id:

select查询的序列号,表示查询中执行select子句或操作表的顺序。

  • id相同时,执行顺序由上至下。
  • id不同,如果是子查询,id序号会递增,id值越大优先级越高,则越先被执行。
  • id相同和不同都存在时,id相同的可以理解为一组,从上往下顺序执行。所有组中,id值越大,优先级越高越先执行。

select_type:

查询的类型,常见值有如下,

  • simple:简单的select查询,查询中不包括子查询或者union。
  • primary:查询中若包含任何复杂的子部分,最外层查询则被标记为primary
  • derived:在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。
  • subquery:在selectwhere列表中包含了子查询。

table:

显示这一行的数据是关于哪张表的。

type:

访问类型排序。最好到最差依次是system>const>eq_ref>ref>range>index>all

  • System:表只有一行记录(等于系统表)是const的特例,可以忽略不计。
  • Const:通过索引一次就找到了,用于比较primary key或unique索引。因为只匹配一行数据,所以很快。
  • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
  • Ref:非唯一性索引扫描,返回匹配某个单独值的所有行。
  • range:只检索给定范围的行,使用一个索引来选择行。
  • index:full index scan。index与all的区别:index类型只遍历索引树。通常比all快,因为索引文件通常比数据文件小。也就是说,虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读取的。
  • all:full table scan。将遍历全表一找到匹配的行。

possible——keys:

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上如果存在索引,则该索引将会被列出来,但不一定会被查询实际使用上。

key:

查询中实际使用的索引,如果为null,则没有使用索引。

ref:

显示索引的哪一列被使用了。哪些列或常量被用于查找索引列上的值。

rows:

显示MySQL认为它执行查询时必须检查的行数。一般越少越好。

extra:

  • using filesort:MySQL无法利用索引完成的排序操作称为“文件排序”
  • using temporary:MySQL在对查询结果排序时使用品是表,常见于排序order by和分组查询group by
  • using index:表示索引被用来执行索引键值的查找,避免访问了表的数据行,效率不错。
  • using where:表示使用了where过滤。

六、索引的失效

失效的第一种情况:模糊匹配当中以“%”开头

select * from emp where ename like '%T';

在上述代码段中,ename上即使添加了索引,也不会进行索引。

原因是模糊匹配当中以“%”开头。所以尽量避免在模糊查询的时候以“%”开头,作为一种优化的手段/策略。

失效的第二种情况:使用or

如果使用or,那么要求or两边的条件字段都要有索引,才会进行索引。如果其中一边有一个字段有索引,另一个字段没有索引,那么另一个字段上的索引也会失效。

所以这就是不建议使用or的原因。

失效的第三种情况:使用复合索引时,没有使用左侧的列查找

复合索引的概念:

        两个字段,或者更多的字段联合起来添加一个索引,叫做复合索引。

如:

create index emp_job_sal_index on emp(job,sal);

失效的第四种情况:在where当中索引列列添加了运算

explain select * from emp where sal+1=800;

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

explain select * from emp where lower(ename)='smith';

七、索引的分类

索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。

索引的分类:

单一索引:一个字段上添加索引。

复合索引:两个字段或者更多的字段上添加索引。

主键索引:主键上添加索引。

唯一性索引:具有unique约束的字段上添加索引。

......

注意:唯一性比较弱的字段上,添加索引用处不大。文章来源地址https://www.toymoban.com/news/detail-601000.html

八、排序优化

  1. 尽量避免使用using filesort方式排序。
  2. order by语句使用索引最左前列或使用where子句与order by自己条件组合满足索引最做前列。
  3. where子句中如果出现索引范围查询会导致order by索引失效。

到了这里,关于MySQL基础(六)-索引(index)详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库基础(九):SQL约束

    文章目录 SQL约束 一、主键约束 二、非空约束 三、唯一约束 四、默认值约束 五、外键约束(了解) 六、总结 PRIMARY KEY 约束唯一标识数据库表中的每条记录。 主键必须包含唯一的值。 主键列不能包含 NULL 值。 每个表都应该有一个主键,并且每个表只能有一个主键。 遵循原

    2024年02月19日
    浏览(60)
  • MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

    目前主流的关系型数据库管理系统: Oracle:大型的收费数据库,Oracle公司产品,价格昂贵。 MySQL:开源免费的中小型数据库,后来Sun公司收购了MySQL,而Oracle又收购了Sun公司。 目前Oracle推出了收费版本的MySQL,也提供了免费的社区版本。 SQL Server:Microsoft 公司推出的收费的中

    2024年02月07日
    浏览(50)
  • MySQL数据库基础(五):SQL语言讲解

    文章目录 SQL语言讲解 一、SQL概述 二、SQL语句分类 1、DDL 2、DML 3、DQL 4、DCL 三、SQL基本语法 1、SQL语句可以单行或多行书写,以分号结尾 2、可使用空格和缩进来增强语句的可读性 3、MySQL数据库的SQL语句不区分大小写,建议使用大写  4、可以使用单行与多行注释 四、总

    2024年02月19日
    浏览(57)
  • MySQL 基础知识(一)之数据库和 SQL 概述

    目录 1 数据库相关概念 2 数据库的结构 ​3 SQL 概要 4 SQL 的基本书写规则 1 数据库相关概念 数据库是将大量的数据保存起来,通过计算机加工而成的可以进行高效访问的数据集合 数据库管理系统(DBMS)是用来管理数据库的计算机系统,通过使用 DBMS,多个用户可以安全、简单

    2024年02月20日
    浏览(52)
  • 一篇文章打好SQL基础,熟悉数据库的基础操作和方法,以及安装MySQL软件包和Python操作MySQL基础使用

    SQL的全称:Structured Query Language,结构化查询语言,用于 访问和处理数据库的标准计算机语言 。 SQL语言1974年有Boyce和Chamberlin提出的,并且首先在IBM公司研制的关系数据库系统SystemR上实现。 经过多年发展,SQL已经成为数据库领域同意的数据操作标准语言,可以说几乎市面上所

    2024年02月08日
    浏览(81)
  • MySQL数据库基础:JSON函数各类操作一文详解

    很多日常业务场景都会用到json文件作为数据存储起来,而mysql5.7以上就提供了存储json的支撑。往常存储json一般都保留在pg库或者是hive库里面,现在mysql有了支持的话基本业务都可以用mysql来实现。现在mysql8.x版本对json字符出处理已经做的非常完善了。现在就让我们来详细了解

    2024年02月04日
    浏览(54)
  • 【Mysql】万字长文带你快速掌握数据库基础概念及SQL基本操作

    为了巩固所学的知识,作者尝试着开始发布一些学习笔记类的博客,方便日后回顾。当然,如果能帮到一些萌新进行新技术的学习那也是极好的。作者菜菜一枚,文章中如果有记录错误,欢迎读者朋友们批评指正。 (博客的参考源码可以在我主页的资源里找到,如果在学习的

    2024年02月15日
    浏览(57)
  • MySQL数据库:索引

            索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。         相当于是给数据库中的数据建立了一个目录,通过目录可以知道数据所在位置,然后到指定位置

    2023年04月17日
    浏览(80)
  • 【MySql】数据库索引

    可以简单理解为一本书的目录信息,是为了提升查找效率而建立的 1、在创建一个主键、唯一键、外键时候,数据库会自动地针对查找字段设置索引; 2、在创建表时侯,使用 index 进行普通索引的声明 3、修改表结构,给指定的字段添加索引 alter table 表名 add index 索引名

    2024年02月03日
    浏览(65)
  • MySQL数据库索引机制

    MySQL是一款有客户端和服务端的网络应用,mysql是它的客户端,mysqld是它的服务端。服务端本质就是一个进程,它存在于内存当中。而我们存储在MySQL中的数据是保存在磁盘上的,当我们对MySQL中数据进行增删查改操作时,不可能是直接在磁盘上进行操作,而是将对应的数据加

    2024年02月12日
    浏览(78)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包