广告
返回顶部
首页 > 资讯 > 数据库 >如何高效利用mysql索引
  • 718
分享到

如何高效利用mysql索引

2024-04-02 19:04:59 718人浏览 八月长安
摘要

这篇文章主要介绍了如何高效利用Mysql索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言mysql 相信大部分人都用过,索引肯定也是用

这篇文章主要介绍了如何高效利用Mysql索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

前言

mysql 相信大部分人都用过,索引肯定也是用过的,但是你知道如何创建恰当的索引吗?在数据量小的时候,不合适的索引对性能并不会有太大的影响,但是当数据逐渐增大时,性能便会急剧的下降。

索引基础

我们都有都知道查字典的步骤,是先在索引页中找到这个字的页码,然后再到对应的页码中查看这个字的信息。mysql 的索引方法也是和这个类似的,先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。假如有下面的 sql 语句:

select * from student where code='2333'

加入 code 列上建立有索引,mysql 将使用该索引找到值为'2333'的数据行,然后读取数据行的所有数据返回。

索引类型

B-Tree 索引

(不是 B 减树,就是 B 树),绝大多数的索引类型都是 B-Tree 的(或者是 B-Tree 的变体),通常我们使用的也是这类索引。Mysql 中 MyISAM 存储引擎使用的是 B-tree,InnoDB 使用的是 B+Tree,B 树和 B+树的区别自行百度。

树结构的索引能够加快访问数据的速度,存储引擎不再需要全表扫描来获取所需的数据,取而代之的是从树的根节点来进行二分搜索,总所周知二分搜索的速度是相当快的,因此我们能够利用索引来极大的提高查询速度。B-Tree 支持以下几种类型的查询:

假设再 student 表中仅有:name,age,weight 这样一个多列索引,下面的查询都能利用到此索引

  • 全值匹配

和索引列中的所有列进行匹配。比如查询name='abc' and age=12,这里用到了第一列和第二列

  • 匹配最左前列

只是用索引的开头部分,比如查询name='ggg'只使用索引的第一列,查询name='ggg' and age=12是用索引的第一、二列。

  • 匹配列前缀

也可以只匹配某一列的开头部分,比如查询name lik 'g%',查询 name 以 g 开头的记录。这里用到了第一列

  • 匹配范围值

可用于匹配范围值,比如查询name > 'abc' and name < 'bcd'

  • 精确匹配某一列并范围匹配另外一列

用于匹配多列,比如查询name='abc' and age > 12。

总的来看,可以发现 B-Tree 索引适用于根据最左前缀的查找,也就是查询字段字段顺序要和索引字段顺序一样,且以第一个索引字段开头。比如查询name,name and age,name and age and weight都能使用索引,但是查询age,age and name不能使用索引。

哈希索引

hash 索引基于 hash 表实现,只有精确匹配索引所有列才会生效。MySQL 中只有 Memory 引擎显示支持哈希索引,同时也是其默认索引。

InnoDB 无法创建 hash 索引,但是它有一个功能叫自适应hash索引,当某些索引值使用非常频繁时,引擎会在内存中基于 B-Tree 索引之上再创建一个 hash 索引,这样就让 B-Tree 索引也有了一点 hash 索引的优点。这个功能是一个完全自动的、内部的行为,也就是无法手动控制或配置。

高性能索引策略

下面是一些常见的索引策略。

独立的列

这个很简单,如果查询中的列不是独立,便无法使用索引,比如:

select * from student where age+1=12

即使 age 列有索引,上面的查询语句也是无法利用索引的。

前缀索引和索引选择性

如果需要索引很长的字符串列,直接创建索引,会让索引占用更多的空间且速度较慢。一个优化策略是模拟 hash 索引:给列计算一个 hash 值,并在 hash 值列建立索引。

另外一个办法就是建立前缀索引。只索引这个字段开始的部分字符,这样可以极大的解决空间占用,索引建立速度也会快很多。但是这样也有如下弊端:

  • 降低了索引选择性,如果多个字符串前缀相同便无法区分,还需要进行字符串对比。

  • 不支持order by,group by,原因显而易见,只索引了部分字符,无法完全区分。

这里的关键是确定索引多少个字符合适。既要避免长度过大,还要有足够的索引选择性。有以下两种办法来帮助确定索引字符数:

索引字段前缀数据分布均匀。也就是以索引字符开头的字符串数目分布均匀,比如索引 name 字段的前 3 个字符,下面的结果是比较合理(只取排名前 8 的):

数目索引前三个字符
500abc
465asd
455acd
431zaf
430aaa
420vvv
411asv
512pdf

如果每一列的数据都比较大,说明区分度还不高需要增大索引字符数,直到这个前缀的选择性接近完整列的索引性,也就是前面的数据要尽可能的小。

计算完整列的选择性,并使前缀的选择性接近于完整列的选择性。下面语句用户计算完整列选择性:

-- 不同字符串的数目/总的数目就是完整列选择性
select count(distinct name)/count(*) from person;

下面语句计算索引前 3 个字段选择性:

-- 前3个字符不同的字符串数据/总的数据
select count(distincy left(city,3))/count(*) from person

不断增大索引字符数目,直到选择性接近完整列选择性且继续增大数据选择性提升幅度不大的时候。

创建方法

-- 假设最佳长度为4
alter table person add key (name(4));

多列索引

不少人有这样的误解,如果一个查询用有多个字段 ‘and'查询,那么给每个字段都建立索引不就能最大化提高效率了?事实并不是如此,mysql 只会选择其中一个字段来进行索引查找。这种情况下应该建立多列索引(又叫联合索引),就能利用多个索引字段了,注意索引列顺序要和查询的顺序一致。

在 5.0 及以上版本中引入了“索引合并”的策略。一定程度上也可以使用多个单列索引,比如下面的查询:

-- mysql会分别使用name和age索引查出数据然后合并
-- 如果使and则查出数据后再对比取交集
select * from person where name = "bob" or age=12

但是不推荐这么做,and 或 or条件过多会耗费大量的 CPU 和内存在算法缓存排序和合并操作上。

选择合适的索引列顺序

在一个多列 B-Tree 索引中,索引列的顺序意味着索引首先是按照最左列进行排序,然后是第二列…索引一个良好的多列索引应该是将选择性最高的索引放在最前面,然后依次降低,这样才能更好的利于索引。选择性计算方发见:前缀索引 小节。

聚族索引

聚族索引不是一种单独的索引类型,而是一种数据存储方法,具体的细节依赖其实现方式。

InnoDB 的聚族索引实际是在同一个结构中保存索引值和数据行。因为不能同时将数据行放在两个不同的地方,所以一个表只能有一个聚族索引。InnoDB 的聚族索引列为“主键列”。

如果没有定义主键,InnoDB 会选择一个唯一的非空索引代替。如果这样的索引也没有,InnoDB 会隐式定义一个主键来作为聚族索引。

聚族索引的主要优点是:可以把相关数据保存在一起,减少磁盘 io,提高查询效率。但是也有缺点:

  • 插入顺序严重依赖于插入顺序。按照主键的顺序插入是速度最快的方式,否则可能会导致页分裂的问题出现,会占用更多的磁盘空间,扫描速度也会变慢。可通过OPTIMIZE TABLE重新组织表。

  • 更新聚族索引列代价很高,因为索引值变了,行数据也会跟着索引移动到新的位置上。

  • 二级索引(非聚族索引)访问行数据需要两次索引查找,因为二级索引叶子节点存储的并不是行数据的物理位置,而是行的主键值,再通过主键值到聚族索引中取行数据。

覆盖索引

简单来说就是一个索引覆盖了需要查询的列字段,这样就不需要再到聚族索引中利用主键进行二次查找,在一个二级索引中就能取到所需的数据。

InnoDB 的索引会在叶子节点中保存索引值,因此如果要查询的字段全部包含在某个索引中,且这个索引被使用了,那么就能极大的提高查询速度。比如如下查询语句:

-- name有索引的情况下,直接从索引的叶子节点中取name值返回,无需二次查找
select name from person where name = 'abc'
-- 如果存在`name,age`聚合索引,也会直接返回数据,无需二次查找
select name,age from person where name='abc' and age=12

使用索引进行排序

mysql 的排序操作也是可以利用索引的,只有当索引的列顺序和ORDER BY的顺序完全一致,并且所有列的排序方法(正序或者倒序)也一样时,才能够使用索引来进行排序。注意:排序的字段可以比对应的索引字段少,但是顺序必须一致。如下:

-- 假设有:(name,age,sex)联合索引
-- 可使用索引排序
select ... order by name desc,age desc
select ... order by name desc,age desc,sex desc
-- 不可使用排序
select ... order by name desc,sex desc
select ... order by name desc,age asc

感谢你能够认真阅读完这篇文章,希望小编分享的“如何高效利用mysql索引”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网数据库频道,更多相关知识等着你来学习!

您可能感兴趣的文档:

--结束END--

本文标题: 如何高效利用mysql索引

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

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

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

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

下载Word文档
猜你喜欢
  • 如何高效利用mysql索引
    这篇文章主要介绍了如何高效利用mysql索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言mysql 相信大部分人都用过,索引肯定也是用...
    99+
    2022-10-18
  • 如何使MySQL的索引更高效
    这篇文章主要介绍如何使MySQL的索引更高效,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!MySQL中的索引MySQL中的InnoDB引擎使用B+Tree结构来存储索引,可以尽量减少...
    99+
    2022-10-19
  • 如何利用 ASP 实现高效索引技术?
    ASP (Active Server Pages) 是一种流行的服务器端脚本语言,用于创建动态网站和 Web 应用程序。在开发 Web 应用程序时,数据检索和搜索功能通常是必不可少的。高效的索引技术可以显著提高数据检索和搜索的速度和效率。本...
    99+
    2023-10-21
    自然语言处理 框架 索引
  • MySQL中如何利用索引
    MySQL中如何利用索引,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、前言在MySQL中进行SQL优化的时候,经常会在一些情况下,对M...
    99+
    2022-10-18
  • 如何有效利用 ASP 索引来提高网站的搜索效率?
    在如今信息爆炸的时代,一个高效的网站搜索功能可以为用户带来很大的便利。而ASP索引是一种常见的提高网站搜索效率的技术,本文将介绍如何有效利用ASP索引来提高网站的搜索效率。 一、什么是ASP索引? ASP索引是一种在Web服务器上创建并维...
    99+
    2023-09-30
    索引 http shell
  • 如何利用Python实现高效索引大数据?
    Python作为一种强大的编程语言,已经成为了数据分析和处理领域中的不可或缺的工具。对于大数据的处理和分析,Python也提供了很多强大的工具和库。本文将介绍如何利用Python实现高效索引大数据。 一、什么是数据索引? 在处理大数据时,...
    99+
    2023-08-04
    索引 异步编程 大数据
  • 如何利用PHP与Spring实现高效实时索引?
    随着信息量的不断增加,搜索引擎的效率也变得越来越重要。实时索引是一种能够让搜索引擎更快速地响应用户查询的方法。在本文中,我们将介绍如何利用PHP与Spring实现高效实时索引。 一、什么是实时索引? 传统的搜索引擎是将数据存储在磁盘中,然后...
    99+
    2023-09-08
    索引 实时 spring
  • ASP编程中如何利用索引提高查询效率?
    在ASP编程中,查询数据库是非常常见的操作。但是,如果数据量过大,查询效率就会变得很低,影响用户体验。为了提高查询效率,我们可以使用索引来优化查询操作。 一、什么是索引? 索引是一种数据结构,它可以帮助我们快速定位数据库中的数据。在数据库...
    99+
    2023-07-02
    编程算法 索引 numy
  • 如何创建高效索引
    索引创建指南:1、频繁在where 从句中出现2、频繁在join关联字段中3、选择具有高选择性的键4、别在具有很少的不同值的键上使用B-tree索引。这类键或表达式经常具有较差选择性,所以不会是性...
    99+
    2022-10-18
  • MySQL中怎么让索引更高效
    本篇文章给大家分享的是有关MySQL中怎么让索引更高效,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MySQL中的索引MySQL中的InnoD...
    99+
    2022-10-18
  • mysql提高索引效率的方法
    本篇内容介绍了“mysql提高索引效率的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明建立查询频率高、数据量大的表索引。对于索引字段...
    99+
    2023-06-20
  • ASP.NET MVC 如何实现高效响应并利用索引优化?
    ASP.NET MVC 是一种用于 Web 应用程序开发的框架,它可以帮助开发人员快速创建高效、可扩展的应用程序。本文将介绍如何利用索引优化来实现 ASP.NET MVC 的高效响应。 什么是索引? 在数据库中,索引是一种用于加速数据检索...
    99+
    2023-08-11
    索引 响应 spring
  • MySQL中如何创建高效且合适的索引
    这篇文章主要介绍了MySQL中如何创建高效且合适的索引,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 当使用索引列进行查询的时候尽量不要...
    99+
    2022-10-18
  • mysql如何判断索引失效
    在mysql中判断索引是否失效的方法:1.命令行启动mysql服务;2.登录mysql;3.选择数据库;4.执行“explain select surname,first_name form a,b where a.id...
    99+
    2022-10-21
  • PHP、NumPy 和 NPM:如何利用索引数据进行高效编程?
    在编程中,索引是一个重要的概念。索引是指在数组、列表、矩阵等数据结构中,确定某个元素位置的方式。在 PHP、NumPy 和 NPM 中,索引数据可以帮助我们更高效地编程。本文将介绍如何利用索引数据进行高效编程。 PHP 中的索引数据 在 ...
    99+
    2023-10-16
    numpy npm 索引
  • 索引优化的利器:使用Java和Linux打造高效的搜索引擎。
    索引优化的利器:使用Java和Linux打造高效的搜索引擎 在当今信息化时代,搜索引擎已经成为人们获取信息的主要途径之一。而如何优化搜索引擎的效率,提高搜索结果的准确性,成为了各大搜索引擎公司和开发者们的重点关注。本文将介绍如何使用Java...
    99+
    2023-10-27
    linux django 索引
  • 如何利用索引提升PHP与MySQL的分页查询效率?
    简介:在使用PHP与MySQL进行分页查询时,为了提高查询效率,可以利用数据库索引来加速查询操作。本文将介绍如何正确创建索引以及如何在PHP代码中进行分页查询。一、什么是索引索引是数据库中一种特殊的数据结构,它可以帮助数据库系统快速定位到存...
    99+
    2023-10-21
    PHP MySQL分页查询 索引(indexing)
  • MySQL性能优化之如何高效正确的使用索引
    实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作的,就可以了。在后续使用索引,或者优化索引时,可以从这些...
    99+
    2022-05-14
    MySQL 索引 MySQL 优化索引 MySQL 高效使用索引
  • Mysql的复合索引如何生效
    目录背景认识复合索引最左匹配原则字段顺序的影响复合索引可以替代单一索引吗?小结背景 最近频繁出现慢SQL导致系统性能问题,于是决定针对索引进行一些优化。一些表结构本身已经有了不少索...
    99+
    2022-11-12
  • Java编程实战:如何利用数组索引实现高效算法?
    在Java编程中,数组是一种基础数据结构,它可以存储一组相同类型的数据。在算法设计中,数组索引是一种重要的工具,它可以帮助我们快速地访问数组中的元素。本文将介绍如何利用数组索引实现高效算法。 一、数组索引的基础知识 在Java中,数组索引...
    99+
    2023-11-12
    索引 数组 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作