广告
返回顶部
首页 > 资讯 > 数据库 >Mysql性能优化:如何给字符串加索引?
  • 433
分享到

Mysql性能优化:如何给字符串加索引?

Mysql性能优化:如何给字符串加索引? 2018-08-13 10:08:16 433人浏览 猪猪侠
摘要

导读 现代大部分的登录系统都支持邮箱、手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能最佳。 本文首发于作

Mysql性能优化:如何给字符串加索引?

导读

  • 现代大部分的登录系统都支持邮箱、手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢?

  • 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能最佳。

  • 本文首发于作者的微信公众号【码猿技术专栏】,原创不易,喜欢的朋友支持一下,谢谢!!!
  • 陈某将会从什么是前缀索引前缀索引和普通索引的比较如何建丽最佳性能的前缀索引前缀索引对覆盖索引的影响这几段来讲。

 

前缀索引

  • 顾名思义,对于列值较长,比如BLOBTEXTVARCHAR,就 "必须" 使用前缀索引,即将值的前一部分作为索引。因为索引的存储也是需要空间的,同样索引太长维护起来也比较困难。

  • 比如我们给User表中的邮箱添加前缀索引,如下:

   alter table user add index index1(email(7));
  • 上述语句将email的前7个字符作为索引。

 

前缀索引和普通索引比较

  • 我们分别将email的全部作为索引和前7个字符作为索引来看看在性能上有什么差异。建立索引的语句如下:

  alter table user add index index1(email);

  alter table user add index index2(email(7));
  • 假设有user表中有这样几条数据(id,name,email):(1,"陈某","chenmou1993@xxx")(2,"张某","chenmou1994@xxx")(3,"李某","chenmou1995@xxx")(4,"王某","chenmou1996@xxx")

  • 对应于index1和index2的索引树如下两张图:

 

  • 如果执行下面的查询语句,mysql如何利用索引来查询呢?

  select * from user where email="chenmou1995@xxx";

 

【1】普通索引的执行过程

  1. 从index1索引树找到满足索引值是chenmou1995@xxx的这条记录,取得id=2的值;

  2. 到主键上查到主键值是id=2的行,判断email的值是正确的,将这行记录加入结果集;

  3. index1索引树上刚刚查到的位置的下一条记录,发现已经不满足email=chenmou1995@xxx的条件了,循环结束。

这个过程中,只需要回主键索引取一次数据,所以系统认为只扫描了一行

 

【2】前缀索引的执行过程

  1. 从index2索引树找到满足索引值是chenmou的记录,找到的第一个是id=1;

  2. 到主键上查到主键值是id=1的行,判断出email的值不是chenmou1995@xxx,这行记录丢弃;

  3. 取index2上刚刚查到的位置的下一条记录,发现仍然是chenmou,取出id=2,再到ID索引上取整行然后判断,这次值对了,将这行记录加入结果集;

  4. 重复上一步,直到在idxe2上取到的值不是chenmou时,循环结束。

  在这个过程中,要回主键索引取4次数据,也就是扫描了4行。

 

  • 通过以上查询的对比,很容易就可以发现,使用前缀索引后,可能会导致查询语句读数据的次数变多。

  • 但是对于这个查询语句来说,如果建立的前缀索引的长度为13呢?那么满足chenmou1995的记录只有一个,这样就可以直接定位到id=2,此时不但空间缩小了,扫描的行数也减少了。

  • 于是结论就来了:使用前缀索引,只要定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。

  • 那么如何建立正确的前缀索引才能达到最佳的性能呢?接着往下看................

 

如何建立最佳性能的前缀索引

  • 通过上述的比较,可以得出一个结论,建立前缀索引的区分度越高越好,意味着重复的键值越少

  • 那么如何统计区分度,其实很简单,只需要判断数据库中重复的次数即可。sql如下:

  select 
   count(distinct left(email,4))as L4,
   count(distinct left(email,5))as L5,
   count(distinct left(email,6))as L6,
   count(distinct left(email,7))as L7,
  from user;
  • 但是如果对于使用前缀区分度不太好的情况,比如,我们国家的身份证号,一共18位,其中前6位是地址码,所以同一个县的人的身份证号前6位一般会是相同的。 这时候如果对身份证号做长度为6的前缀索引的话,这个索引的区分度就非常低了。

  • 按照我们前面说的方法,可能你需要创建长度为12以上的前缀索引,才能够满足区分度要求。

  • 但是,索引选取的越长,占用的磁盘空间就越大,相同的数据页能放下的索引值就越少,搜索的效率也就会越低。

  • 那么,如果我们能够确定业务需求里面只有按照身份证进行等值查询的需求,还有没有别的处理方法呢?这种方法,既可以占用更小的空间,也能达到相同的查询效率。现在简单的介绍一种解决此种问题的方式,当然方法肯定不止一种,如下:

 

  倒序存储

  如果你存储身份证号的时候把它倒过来存,每次查询的时候,你可以这么写:

   select field_list from t where id_card = reverse("输入的身份证号");

  由于身份证号的最后6位没有地址码这样的重复逻辑,所以最后这6位很可能就提供了足够的区分度。当然了,实践中你不要忘记使用count(distinct)方法去做个验证。

 

前缀索引对覆盖索引的影响

  • 前缀索引会导致覆盖索引失效,查询语句如下:

  select id,name from user where email="chenmou1995@xxx";
  • 由于使用了前缀索引,因此必须会回表验证查询到的时候正确,此处使用了覆盖索引也是无效的。

  • 也就是说,使用前缀索引就用不上覆盖索引对查询性能的优化了,这也是你在选择是否使用前缀索引时需要考虑的一个因素。

 

总结

  • 如何给字符串加索引是一个需要考量的问题,陈某在这里给出如下的建议:

  1. 如果字符串长度很短,建议直接用全部作为索引。

  2. 使用前缀索引注意分析区分度,区分度越高越好。

  3. 使用前缀索引需要考虑覆盖索引失效的问题。

 

您可能感兴趣的文档:

--结束END--

本文标题: Mysql性能优化:如何给字符串加索引?

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

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

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

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

下载Word文档
猜你喜欢
  • Mysql性能优化:如何给字符串加索引?
    导读 现代大部分的登录系统都支持邮箱、手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能最佳。 本文首发于作...
    99+
    2018-08-13
    Mysql性能优化:如何给字符串加索引?
  • MySQL如何给字符串字段加索引
    这篇文章给大家分享的是有关MySQL如何给字符串字段加索引的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:create table S...
    99+
    2023-06-29
  • MySQL怎么给字符串字段加索引
    假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的: create table SUser(  ID bigint unsigned primary key,  email ...
    99+
    2022-11-13
  • MySQL怎么给字符串加一个高效索引
    这篇文章主要介绍了MySQL怎么给字符串加一个高效索引的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL怎么给字符串加一个高效索引文章都会有所收获,下面我们一起来看看吧。需求在日常需求中,用户使用手机号或...
    99+
    2023-07-05
  • MySQL给字符串加一个高效索引的实现
    目录需求前缀索引倒序+前缀索引总结需求 在日常需求中,用户使用手机号或者邮箱登录某一个系统,是一个很常见的操作,那如何在类似手机号或者邮箱这样的字段上建立一个合理的索引呢? 前缀索引 前缀索引,就是以一个字段值的一部分作...
    99+
    2023-03-20
    MySQL字符串高效索引 MySQL字符串索引
  • 记一次MySQL字符串索引优化方案
    本文已收录GitHub,更有互联网大厂面试真题,面试攻略,高效学习资料等 字符串建立索引的优化 1. 建立前缀索引 假设建立一个支持邮箱登录的用户表,对于邮件字段来说,可以有以下几种建立索引的方式: ①. 直接对整个字符串建立索引 alt...
    99+
    2017-06-13
    记一次MySQL字符串索引优化方案 数据库入门 数据库基础教程 数据库 mysql
  • PHP与MySQL索引的字符串匹配和全文检索的性能优化策略及其对性能的影响
    摘要:在现代Web应用中,字符串匹配和全文检索是非常常见的功能需求。对于大规模的数据查询,这些操作可能会成为性能瓶颈。本文将探讨如何优化PHP与MySQL的字符串匹配和全文检索操作,以提高性能并降低响应时间。具体包括使用索引、优化查询语句和...
    99+
    2023-10-21
    PHP和MySQL 性能优化 (performance optimization) 索引 (Index)
  • .NET性能优化ValueStringBuilder拼接字符串如何使用
    今天小编给大家分享一下.NET性能优化ValueStringBuilder拼接字符串如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2023-07-02
  • Java 性能优化中如何进行字符串过滤
    本篇文章给大家分享的是有关Java 性能优化中如何进行字符串过滤,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。★一个简单的需求  首先描述一下需求:给定一个 String 对象...
    99+
    2023-06-02
  • MySQL如何基于Explain关键字优化索引功能
      explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。简单讲,它的作用就是分析查询性能。   explain关键字的使用方法很简单,就...
    99+
    2022-05-12
    MySQL Explain关键字 索引
  • 如何解决MySql整型索引和字符串索引失效或隐式转换问题
    这篇文章主要为大家展示了“如何解决MySql整型索引和字符串索引失效或隐式转换问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决MySql整型索引和字符串索引失效或隐式转换问题”这篇文章...
    99+
    2023-06-25
  • MySQL性能优化之如何高效正确的使用索引
    实践是检验真理的唯一途径,本篇只是站在索引使用的全局来定位的,你只需要通读全篇并结合具体的例子,或回忆以往使用过的地方,对整体有个全面认识,并理解索引是如何工作的,就可以了。在后续使用索引,或者优化索引时,可以从这些...
    99+
    2022-05-14
    MySQL 索引 MySQL 优化索引 MySQL 高效使用索引
  • Java实时重定向索引:如何优化搜索引擎的性能?
    搜索引擎是我们日常生活中不可或缺的工具,对于搜索引擎来说,搜索速度和搜索结果的准确性是至关重要的。如何提高搜索引擎的性能,让用户能够更快地获取到想要的结果,是每个搜索引擎开发人员都需要关注和解决的问题。在本文中,我们将介绍一种优化搜索引擎...
    99+
    2023-09-21
    实时 重定向 索引
  • Python 索引:如何使用实时打包优化搜索性能?
    Python 是一种高级编程语言,广泛用于数据分析、机器学习、人工智能等领域。在这些应用场景中,数据的搜索和查询是非常常见的操作。对于大规模的数据集合,搜索和查询的效率是一个非常重要的问题。在这篇文章中,我们将介绍 Python 中的索引...
    99+
    2023-10-29
    索引 实时 打包
  • 如何利用 Python 中的索引优化程序性能?
    Python 是一种高级编程语言,虽然它非常简单易学,但在处理大规模数据时,程序的性能往往会成为一个瓶颈。因此,我们需要使用一些优化技巧来提高程序性能。其中之一就是利用 Python 中的索引。 索引是一个指向存储在内存中的数据结构的指针。...
    99+
    2023-10-20
    索引 日志 面试
  • Java编程中,如何优化索引算法的性能?
    在Java编程中,索引算法是一个非常重要的算法,它可以帮助我们快速的查找和访问数据。然而,如果我们的索引算法性能不好,就会导致程序运行缓慢,影响用户的体验。因此,在Java编程中,如何优化索引算法的性能,成为了一个非常重要的问题。 本文将...
    99+
    2023-11-13
    索引 编程算法 开发技术
  • Bash 脚本如何优化 Java 实时索引的性能?
    在现代的软件开发中,实时索引已经成为了非常常见的需求。Java 作为一种流行的编程语言,在实时索引的应用中也得到了广泛的应用。但是,对于实时索引而言,性能是一个非常重要的问题。为了优化 Java 实时索引的性能,我们可以使用 Bash 脚...
    99+
    2023-08-26
    bash 索引 实时
  • 如何在Java中优化Linux分布式索引的性能?
    在分布式系统中,索引的性能往往是一个非常重要的问题。在Linux系统中,我们可以使用Java语言进行开发,但是如何优化索引的性能呢?本文将介绍一些优化技巧,帮助您在Java中优化Linux分布式索引的性能。 一、使用集群模式 在Linux分...
    99+
    2023-08-24
    分布式 索引 linux
  • 如何在Laravel项目中优化索引以提高性能?
    Laravel是一款流行的PHP框架,可以帮助开发者快速构建Web应用程序。然而,当应用程序规模逐渐扩大时,性能问题可能会成为一个挑战。 在本文中,我们将探讨如何通过优化Laravel项目中的索引来提高性能。 什么是索引? 在数据库中,索引...
    99+
    2023-08-08
    索引 laravel git
  • PHP中的Laravel框架:如何优化索引以提高性能?
    Laravel是一个流行的PHP框架,它提供了许多强大的功能和工具,使得开发Web应用程序变得更加容易和高效。其中,对于数据库操作,Laravel提供了Eloquent ORM,使得数据库操作变得简单和直观。但是,当我们处理大量数据时,性...
    99+
    2023-08-08
    索引 laravel git
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作