优化MySQL前缀索引[通俗易懂]

优化MySQL前缀索引[通俗易懂]文章介绍如何如何创建MySQL前缀索引,以及计算索引的选择性,明确使用前置索引的场景。

大家好,又见面了,我是你们的朋友全栈君。

目标

  1. 明确前缀索引使用场景;
  2. 掌握创建前缀索引的语法;
  3. 掌握计算索引选择性的方法。

定义

    对于字符串列,可以使用语法指定索引前缀长度来创建仅使用列值开头的索引。
    语法:
        CREATE INDEX 自定义索引名称 ON 表名字(字段名(截取该字段的位数));
    举例:
        /*为pharmacy表创建一个名字为name_of_drug_10的前缀索引,这个索引截取了name_of_drug字段的前10位。*/
        CREATE INDEX name_of_drug_10 ON pharmacy (name_of_drug(10));

场景

如果需要对BLOBTEXT类型的列创建索引,则只能创建前缀索引。


使用方法

通过索引选择性来确定前缀索引截取的字节位数,索引的选择性指不重复的索引值与数据总量的比值。索引的选择性越高则查询效率越高,因为选择性更高的索引可以让mysql在查找的时候过滤掉更多的行。

  • 案例
    /*给pharmacy表建立以name_of_drug字段为前缀的索引,先来计算索引选择性。*/
    SELECT 
    COUNT(DISTINCT LEFT(name_of_drug,3))/COUNT(1) AS selectivity3,
    COUNT(DISTINCT LEFT(name_of_drug,4))/COUNT(1) AS selectivity4,
    COUNT(DISTINCT LEFT(name_of_drug,5))/COUNT(1) AS selectivity5,
    COUNT(DISTINCT LEFT(name_of_drug,6))/COUNT(1) AS selectivity6,
    COUNT(DISTINCT LEFT(name_of_drug,7))/COUNT(1) AS selectivity7,
    COUNT(DISTINCT LEFT(name_of_drug,8))/COUNT(1) AS selectivity8, 
    COUNT(DISTINCT LEFT(name_of_drug,9))/COUNT(1) AS selectivity9
    FROM pharmacy;
  • 结果集

优化MySQL前缀索引[通俗易懂]

  • 结论

截取name_of_drug前6个字节进行对比就已经有99.74%的数据不一样了,所以可以选择name_of_drug前6个字节为前缀创建前缀索引:

    CREATE INDEX name_of_drug_6 ON pharmacy (name_of_drug(6));

注意

索引的选择性在80%以上适合建立,否则不建议建立索引,例如性别等。

前缀支持和前缀长度(如果支持)取决于存储引擎。例如,对于InnoDB 使用REDUNDANT 或 COMPACT 行格式的表,前缀的最大长度为767个字节。对于InnoDB使用DYNAMIC或COMPRESSED 行格式的表,前缀长度限制为3072字节。对于MyISAM表,前缀长度限制为1000个字节。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142343.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • kubeadm添加新master或node

    kubeadm添加新master或node

    2021年5月31日
    105
  • linux initramfs加载系统指令_正在生成initramfs

    linux initramfs加载系统指令_正在生成initramfs下面来介绍一下initramfsinitramfs是编到内核中的一种根文件系统,使用的是cpio格式,处理流程和我们之前介绍的initrd机制的cpio格式的流程几乎一样,只不过这个是编译到内核里的,需要用到时内核会自行解压使用。我们在编内核的时候,可以通过Initramfssourcefile(s)来设置需要编入内核的文件系统的路径。Generalsetup—>(就是CO…

    2022年8月11日
    5
  • python interpolate.interp1d,Python interp1d与UnivariateSpline

    python interpolate.interp1d,Python interp1d与UnivariateSplineI’mtryingtoportsomeMatLabcodeovertoScipy,andI’vetriedtwodifferentfunctionsfromscipy.interpolate,interp1dandUnivariateSpline.Theinterp1dresultsmatchtheinterp1dMatLabfunctio…

    2022年6月11日
    31
  • 打开redis远程访问端口_linux端口开放命令

    打开redis远程访问端口_linux端口开放命令一、问题详情最近我在阿里云ESC上购买了一台服务器,但是在安装完redis后,我在本地的电脑上怎么也没法调用这台服务器上面的redis服务。最后,我终于解决了,所以来记录一下。二、解决方案想要解决这个问题,前提条件是已经在阿里云的安全组设置里面已经开放了3679这个端口。接着我们要修改两个配置文件。redis.conf尽量将最初始的redis.conf复制一份,防止以后修改该配置文件出现问题。 执行修改配置文件的命令 vim/opt/myRedis/redis.co

    2025年11月24日
    3
  • 公钥\私人 ssh避password登陆

    公钥\私人 ssh避password登陆

    2022年1月13日
    50
  • STUN详解

    STUN详解STUN是一个简单的客户端-服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。有两种类型的请求:绑定请求(通过UDP发送)和共享密钥请求(发送TLS(通过TCP))。共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,身份验证和消息完整性的目的。STUN客户和STUN服务器之间可能有一个或多个NAT。

    2022年7月17日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号