MySQL索引详解

一、什么是索引?为什么要建立索引?

索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。
打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。
拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到需要的字。

二、MySQL中索引的优缺点及使用原则

优点:

1、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引

2、大大加快数据的查询速度

缺点:

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

使用原则:

通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,

2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。

三、Explain执行器名词解释

1、作用

  • 复杂sql语句的读取顺序
  • sql中有哪些索引可以使用
  • sql中哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

2、使用方法

  • EXPLAIN + 查询sql
  • 如:EXPLAIN SELECT * FROM test_index;

3、基本字段解读
在这里插入图片描述
4、Explain字段详解
id

select查询的序列号,并不是单纯的从上到下或者从下向上执行,共有三种情况
 - id相同:按照从上到下的顺序执行
 - id不同:按照id值由大到小的顺序执行
 - id既有相同又有不同:先执行id值大的,然后相同值的从上到下执行

select_type

分别用来表示查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。
值如下:
 - SIMPLE:简单查询,不包含子查询和UNION查询
 - PRIMARY:主查询,如包含子查询的sql中的父查询
 - SUBQUERY:查询sql中的子查询
 - DERIVED:衍生查询(在from列表中的子查询,Mysql递归这些子查询,结果放到临时表中)
 - UNION:联合查询,t1 UNION t2 中的t2
 - UNION RESULT:从UNION表获取结果的SELECT分别用来表示查询的类型

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
table

一般指查询的表,对于带尖括号的,表示select_type + id的指向。

partitions

如果查询是基于分区表的话,会显示查询将访问的分区。

type

type所显示的是查询使用了哪种类型
查询速度:null > syetem > const > eq_ref > ref > range > index > all
 - null:甚至不需要访问索引表,例如主键作为条件超过当前表主键最大值;
 - system:const的特殊情况,只有一条数据的系统表
 - const:使用唯一索引等价查询,仅能匹配到一条数据
 - eq_ref:使用唯一索引作为关联条件,匹配多条不重复数据
 - ref:普通索引等价
 - range:检索给定范围的索引 , ><>=<=between and
 - index:仅查询索引表
 - all:遍历全表以找到匹配的行

possible_keys

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

key

查询中实际使用到的索引,小于等于possible_keys

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好。
key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。

在这里插入图片描述

ref

表示查询中的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数,也就是说,用的越少越好 

filtered

按表条件过滤的行百分比

Extra

查询结果的备注信息,很重要
Using index:性能提升,索引覆盖,此查询仅查询索引不需要回表查询
Using where:该查询中使用了where条件过滤
Using index, Using where:双条件,表明索引被用来执行索引键值的查找
Using filesort:性能消耗大,需要额外一次排序(查询)
Using temporary:性能消耗大,用到临时表,常见于order bygroup by
Using join buffer	连接缓存
impossible wherewhere子句的值总是false,不能用来获取任何元组
distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作

四、索引的分类

注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引

存储引擎种类:
在这里插入图片描述
查看当前版本存储引擎信息:
在这里插入图片描述
两种在实际开发中使用最多的两种引擎【MyISAM】和【InnoDB】。
MyISAM和InnoDB存储引擎:只支持BTREE索引, 也就是说默认使用BTREE,不能够更换。
MEMORY/HEAP存储引擎:支持HASH和BTREE索引。
MySQL目前主要有以下几种索引类型:

1、 普通索引

这是最基本的索引,它没有任何限制。它有以下几种创建方式:

(1)直接创建索引

CREATE INDEX index_name ON table(column(length)) 

(2)修改表结构的方式添加索引

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

(3)创建表的时候同时创建索引

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`),
    INDEX index_name (title(length))
)

2、 唯一索引

与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

(1)创建唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

(2)修改表结构

ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

(3)创建表的时候直接指定

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 ,
    UNIQUE indexName (title(length))
);

3、 主键索引

是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT ,
    `title` char(255) NOT NULL ,
    PRIMARY KEY (`id`)
);

4、 组合索引

组合索引就是在多个字段上创建一个索引,如:

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age); 

在这里插入图片描述
在这里插入图片描述
最左前缀原则:只有当查询条件为name,name and city,name and city and age三种情况下才会走索引name_city_age。在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

5、全文索引

主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
在这里插入图片描述

以上就是MySQL索引的介绍,如果有不当之处或者遇到什么问题,欢迎在文章下面留言~
如果你想了解更多关于MySQL的内容,可以查看:MySQL学习目录
转载请注明:https://blog.csdn.net/weixin_44662961/article/details/106287127

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MySQL 索引下推是一种优化查询的技术,它可以通过对索引进行排序和过滤来减少查询的行数,从而提高查询性能。在索引下推中,MySQL 会将索引中的符合条件的行预先取出来,然后再对这些行进行排序和过滤。这样可以避免对整个表进行排序和过滤,减少查询时间。 MySQL 索引下推的条件有: 1. 使用索引列进行过滤 2. 使用索引列进行排序 3. 只返回索引列 使用索引下推,可以大大提高查询性能,特别是对于大表的查询。 ### 回答2: MySQL索引下推是一种优化查询性能的技术。传统的索引使用方法是首先通过索引找到满足条件的记录,然后再对这些记录进行进一步的过滤。而索引下推则是在进行索引查询时,将过滤条件应用于索引的过程中,减少了需要进一步过滤的记录数量,从而提高了查询的效率。 索引下推的基本原理是,在查询时通过索引找到满足条件的记录,然后再利用索引的属性,对这些记录进行进一步的过滤,将不满足条件的记录排除掉。 索引下推的好处在于减少了磁盘IO和数据传输的开销。由于不满足条件的记录被排除在索引搜索过程中,数据引擎只需要读取和传输满足条件的记录,从而减少了磁盘IO和网络传输的负载,提高了查询的效率和性能。 索引下推需要满足两个条件。首先,查询语句必须包含使用到索引的条件,这样才能利用索引进行查询。其次,索引的选择性必须足够高,以保证查询时会有大量的不满足条件的记录可以被排除。 需要注意的是,索引下推只对联合索引起作用,单列索引是不会触发索引下推的优化的。 总而言之,索引下推是一种提高MySQL查询性能的技术,通过在索引搜索过程中对满足条件的记录进行进一步的过滤,减少了不必要的IO和数据传输开销,从而提高了查询效率和性能。 ### 回答3: MySQL索引下推(Index Condition Pushdown,简称ICP)是一种优化技术,专门针对多条件查询进行优化。在传统的查询过程中,MySQL首先根据索引定位到符合WHERE条件的行,然后再判断其他条件是否满足。而索引下推则是将除了WHERE条件之外的其他条件也推到存储引擎层进行判断,减少了不必要的数据传输。 索引下推的过程如下:首先,根据WHERE条件,MySQL通过索引找到第一条满足条件的记录,并将这条记录的索引字段保存起来。然后,继续通过索引向下遍历,将符合条件的索引字段和前一条记录的索引字段进行比较,如果相同,则表示满足所有条件,将该行返回给查询结果;如果不同,则表示不满足所有条件,继续向下遍历。 索引下推的优势在于减少了不必要的IO操作和数据传输,提高了查询性能。尤其在范围查询等复杂查询条件下,索引下推可以避免读取大量无关的数据。同时,索引下推也可以减轻服务器负载,提高查询的并发性能。 值得注意的是,索引下推的效果受到多种因素的影响。首先,索引字段的选择很重要,适合作为索引下推的字段应该是高选择性的字段。其次,查询条件中的逻辑关系也会影响索引下推的效果,AND操作适合索引下推,而OR操作则不能使用索引下推。 总而言之,索引下推是MySQL的一项重要优化技术,通过将多条件判断推到存储引擎层进行,减少了IO操作和数据传输,提高了查询性能和并发性能。在实际应用中,需要根据具体情况选择合适的索引字段,并注意查询条件的逻辑关系,以获取最佳的查询效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值