返回顶部
首页 > 资讯 > 数据库 >MySQL中如何利用索引
  • 210
分享到

MySQL中如何利用索引

2024-04-02 19:04:59 210人浏览 独家记忆
摘要

Mysql中如何利用索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、前言在mysql中进行sql优化的时候,经常会在一些情况下,对M

Mysql中如何利用索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

一、前言

mysql中进行sql优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。

譬如:

1、MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件?

2、MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢?

3、MySQL 到底在怎么样的情况下能够利用索引进行排序

今天,我将会用一个模型,把这些问题都一一解答,让你对MySQL索引的使用不再畏惧。

二、知识补充

key_len

EXPLaiN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了。

在这里 key_len 大小的计算规则是:

  • 一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;

  • 如果是字符串类型,还需要同时考虑字符集因素,例如:CHAR(30) UTF8则key_len至少是90 bytes;

  • 若该列类型定义时允许NULL,其key_len还需要再加 1 bytes;

  • 若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes;

三、哪些条件能用到索引

首先非常感谢登博,给了我一个很好的启发,我通过他的文章,然后结合自己的理解,制作出了这幅图

MySQL中如何利用索引

乍一看,是不是很晕,不急,我们慢慢来看

图中一共分了三个部分:

1、Index Key :MySQL是用来确定扫描的数据范围,实际就是可以利用到的MySQL索引部分,体现在Key Length。

2、Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。

3、Table Filter:MySQL无法用索引过滤,回表取回行数据后,到server层进行数据过滤。

我们细细展开。

Index Key

Index Key是用来确定MySQL的一个扫描范围,分为上边界和下边界。

MySQL利用=、>=、> 来确定下边界(first key),利用最左原则,首先判断***个索引键值在where条件中是否存在,如果存在,则判断比较符号,如果为(=,>=)中的一种,加入下边界的界定,然后继续判断下一个索引键,如果存在且是(>),则将该键值加入到下边界的界定,停止匹配下一个索引键;如果不存在,直接停止下边界匹配。

exp: idx_c1_c2_c3(c1,c2,c3) where c1>=1 and c2>2 and c3=1 -->  first key (c1,c2) --> c1为 '>=' ,加入下边界界定,继续匹配下一个 -->c2 为 '>',加入下边界界定,停止匹配

上边界(last key)和下边界(first key)类似,首先判断是否是否是(=,<=)中的一种,如果是,加入界定,继续下一个索引键值匹配,如果是(<),加入界定,停止匹配

exp:  idx_c1_c2_c3(c1,c2,c3)  where c1<=1 and c2=2 and c3<3  --> first key (c1,c2,c3)  --> c1为 '<=',加入上边界界定,继续匹配下一个  --> c2为 '='加入上边界界定,继续匹配下一个  --> c3 为 '<',加入上边界界定,停止匹配

注:这里简单的记忆是,如果比较符号中包含'='号,'>='也是包含'=',那么该索引键是可以被利用的,可以继续匹配后面的索引键值;如果不存在'=',也就是'>','<',这两个,后面的索引键值就无法匹配了。同时,上下边界是不可以混用的,哪个边界能利用索引的的键值多,就是最终能够利用索引键值的个数。

Index Filter

字面理解就是可以用索引去过滤。也就是字段在索引键值中,但是无法用去确定Index Key的部分。

exp:  idex_c1_c2_c3  where c1>=1 and c2<=2 and c3 =1  index key --> c1  index filter--> c2 c3

这里为什么index key 只是c1呢?因为c2 是用来确定上边界的,但是上边界的c1没有出现(<=,=),而下边界中,c1是>=,c2没有出现,因此index key 只有c1字段。c2,c3 都出现在索引中,被当做index filter.

Table Filter

无法利用索引完成过滤,就只能用table filter。此时引擎层会将行数据返回到server层,然后server层进行table filter。

四、Between 和Like 的处理

那么如果查询中存在between 和like,MySQL是如何进行处理的呢?

Between

where c1 between  'a' and 'b' 等价于 where c1>='a' and c1 <='b',所以进行相应的替换,然后带入上层模型,确定上下边界即可

Like

首先需要确认的是%不能是最在最左侧,where c1 like '%a' 这样的查询是无法利用索引的,因为索引的匹配需要符合最左前缀原则

where c1 like 'a%'  其实等价于 where c1>='a' and c1<'b' 大家可以仔细思考下。

五、索引的排序

数据库中,如果无法利用索引完成排序,随着过滤数据的数据量的上升,排序的成本会越来越大,即使是采用了limit,但是数据库是会选择将结果集进行全部排序,再取排序后的limit 记录,而且MySQL 针对可以用索引完成排序的limit 有优化,更能减少成本。

Make sure it uses index It is very important to have ORDER BY with LIMIT executed without scanning and sorting full result set, so it is important for it to use index &ndash; in this case index range scan will be started and query execution stopped as soon as soon as required amount of rows generated.

CREATE TABLE `t1` (      `id` int(11) NOT NULL AUTO_INCREMENT,      `c1` int(11) NOT NULL DEFAULT '0',      `c2` int(11) NOT NULL DEFAULT '0',      `c3` int(11) NOT NULL DEFAULT '0',      `c4` int(11) NOT NULL DEFAULT '0',      `c5` int(11) NOT NULL DEFAULT '0',      PRIMARY KEY (`id`),      KEY `idx_c1_c2_c3` (`c1`,`c2`,`c3`)    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4      select * from t1;    +----+----+----+----+----+----+    | id | c1 | c2 | c3 | c4 | c5 |    +----+----+----+----+----+----+    |  1 |  3 |  3 |  2 |  0 |  0 |    |  2 |  2 |  4 |  5 |  0 |  0 |    |  3 |  3 |  2 |  4 |  0 |  0 |    |  4 |  1 |  3 |  2 |  0 |  0 |    |  5 |  1 |  3 |  3 |  0 |  0 |    |  6 |  2 |  3 |  5 |  0 |  0 |    |  7 |  3 |  2 |  6 |  0 |  0 |    +----+----+----+----+----+----+    7 rows in set (0.00 sec)      select c1,c2,c3 from t1;    +----+----+----+    | c1 | c2 | c3 |    +----+----+----+    |  1 |  3 |  2 |    |  1 |  3 |  3 |    |  2 |  3 |  5 |    |  2 |  4 |  5 |    |  3 |  2 |  4 |    |  3 |  2 |  6 |    |  3 |  3 |  2 |    +----+----+----+    7 rows in set (0.00 sec)

存在一张表,c1,c2,c3上面有索引,select c1,c2,c3 from t1; 查询走的是索引全扫描,因此呈现的数据相当于在没有索引的情况下select c1,c2,c3 from t1 order by c1,c2,c3; 的结果

因此,索引的有序性规则是怎么样的呢?

c1=3 &mdash;> c2 有序,c3 无序

c1=3,c2=2 &mdash; > c3 有序

c1 in(1,2) &mdash;> c2 无序 ,c3 无序

有个小规律,idx_c1_c2_c3,那么如何确定某个字段是有序的呢?c1 在索引的最前面,肯定是有序的,c2在第二个位置,只有在c1 ***确定一个值的时候,c2才是有序的,如果c1有多个值,那么c2 将不一定有序,同理,c3也是类似

关于MySQL中如何利用索引问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中如何利用索引

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

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

猜你喜欢
  • MySQL中如何利用索引
    MySQL中如何利用索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、前言在MySQL中进行SQL优化的时候,经常会在一些情况下,对M...
    99+
    2024-04-02
  • 如何高效利用mysql索引
    这篇文章主要介绍了如何高效利用mysql索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言mysql 相信大部分人都用过,索引肯定也是用...
    99+
    2024-04-02
  • MySQL中如何使用索引
    这篇文章给大家介绍MySQL中如何使用索引,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。mysql采用b+树的方式存储索引信息。b+树结构如下:说一下b+树的几个特点:叶子节点(最下面...
    99+
    2024-04-02
  • 如何利用MySQL添加联合唯一索引
    目录联合唯一索引扩展延伸:附:mysql中如何用命令创建联合索引总结联合唯一索引 项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,...
    99+
    2024-04-02
  • 创建和利用MySQL索引
    MySQL索引的创建和使用 MySQL是一种常用的关系型数据库管理系统,用于存储和管理数据。在处理大量数据时,索引是提高查询性能的关键。本文将介绍MySQL索引的创建和使用方法,并提供...
    99+
    2024-02-22
    使用 (use) mysql索引
  • SQL如何利用索引排序
    这篇文章主要为大家展示了“SQL如何利用索引排序”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SQL如何利用索引排序”这篇文章吧。近期在做数据库的慢SQL优化,...
    99+
    2024-04-02
  • MySQL索引如何创建和使用索引
    创建MySQL索引可以通过以下两种方式: 使用CREATE INDEX语句创建索引: CREATE INDEX index_na...
    99+
    2024-03-06
    MySQL
  • 如何使用mysql索引
    这篇文章主要为大家展示了如何使用mysql索引,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。什么是索引:索引可以帮助快速查找数据而基本上索引都要求唯一(有些不...
    99+
    2024-04-02
  • mysql索引如何使用
    小编给大家分享一下mysql索引如何使用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、索引是什么1.索引简介索引其实是以文件...
    99+
    2024-04-02
  • MySQL如何使用索引
    这篇文章给大家分享的是有关MySQL如何使用索引的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MYSQL的事务配置项 innodb_flush_log_at_trx...
    99+
    2024-04-02
  • MySQL中如何使用多列索引
    MySQL中如何使用多列索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多列索引我们经常听到一些人说"把WHERE条件里的...
    99+
    2024-04-02
  • MySQL中如何优化索引
    MySQL中如何优化索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。文章的脑图如下:索引优化规则1、like语句的前导模糊查询不能使用索...
    99+
    2024-04-02
  • mysql中如何删除索引
    这篇文章主要介绍了mysql中如何删除索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、根据索引名删除普通索引、唯一索引、全文索引。alter table&nb...
    99+
    2023-06-15
  • mysql中如何创建索引
    这篇文章主要介绍mysql中如何创建索引,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER TABLE来为表增加索引。1、...
    99+
    2023-06-15
  • MySQL中怎么利用字符串做索引
    今天就跟大家聊聊有关MySQL中怎么利用字符串做索引,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在PC互联网时代,我们的很多账户都需要绑定电子邮箱...
    99+
    2024-04-02
  • 如何在mysql中使用哈希索引
    这期内容当中小编将会给大家带来有关如何在mysql中使用哈希索引,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、Hash索引应进行二次搜索。使用哈希索引两次搜索,第一次找到相应的行,第二次读取数据,但频...
    99+
    2023-06-15
  • 如何在MySQL中使用前缀索引?
    如何在MySQL中使用前缀索引? MySQL是一款非常流行的关系型数据库管理系统,它支持使用索引来提高查询性能。在某些情况下,如果数据库表中的列具有较长的值,可以考虑使用前缀索引来减少...
    99+
    2024-03-15
    mysql 前缀索引
  • mysql如何加索引
    如何为 mysql 表格添加索引 MySQL 索引是一种数据结构,它可以提高查询性能。它通过对数据列进行排序和分组,从而减少了数据库在执行查询时需要扫描的行数。 添加索引的步骤: 确...
    99+
    2024-06-12
    mysql
  • sql如何利用索引消除排序
    本篇内容介绍了“sql如何利用索引消除排序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.1.1&nbs...
    99+
    2024-04-02
  • 如何在MySQL中创建索引
    本篇文章为大家展示了如何在MySQL中创建索引,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是索引?MySQL官方对索引的定义为:索引(Index)是帮助MyS...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作