优化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));

场景

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


使用方法

通过索引选择性来确定前缀索引截取的字节位数,索引的选择性指不重复的索引值与数据总量的比值。索引的选择性越高则查询效率越高,因为选择性更高的索引可以让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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C# WinForm界面美化插件简介

    C# WinForm界面美化插件简介 美化C#的WIN程序界面可以考虑用第三方控件,比如DotNetBar或DevExpress。但是它们都是收费的,虽然有破解版。。但是使用时还是需要权衡的。另外,用第三方控件会让运行速度下降。 1.      DevExpress收费软件 2.      Rad 3.      Irisskin2在项目中添加DLL文件,在程序中控制显示即可。使

    2022年5月8日
  • Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性

    Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性Laravel Model的 fillable (白名单) 和 guarded (黑名单)属性

    2022年4月24日
  • 多维数组转化为一维数组_数组的大小长度可以改变吗

    多维数组转化为一维数组_数组的大小长度可以改变吗allocaalloca是GNUlibc中的内存分配函数。voidfunc(){void*p=alloca(size);//dosomethingusingp//…}一般来说,alloca的内存是在调用alloca的函数func的栈上分配的,当func返回或者异常退出的时候,分配的内存或自动释放。以上说的是一般的情…

    2022年10月29日
  • MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码

    MyBatis快速入门第八讲——MyBatis逆向工程自动生成代码MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码什么是逆向工程MyBatis的一个主要的特点就是需要程序员自己编写sql,那么如果表太多的话,难免会很麻烦,所以mybatis官方提供了一个逆向工程,可以针对单表自动生成mybatis执行所需要的代码(包括mapper.xml、mapper.java、po..)。一般在开发中,常用的逆向工程方式是通过数据库的表生成代码。使用逆向工程

    2022年6月19日
  • double转bigDecimal精度问题

    double转bigDecimal精度问题double转bigDecimal精度问题需要用到bigDecimal的字符串构造来转float的精度:2^237位double的精度:2^5216位十进制转二进制存在精度差doubleg=12.35;BigDecimalbigG=newBigDecimal(g).setScale(1,BigDecimal.ROUND_HALF_UP);//…

    2022年6月4日
  • 二进制减法图解_二进制加法的算法图解

    二进制减法图解_二进制加法的算法图解二进制减法类似于十进制的减法,我们从十进制的减法来推出二进制减法如何进行运算。十进制减法例如74323-47562=26761的运算。灰色部分为计算过程,绿色字为被减一得到的数,红色字为借一后得到的数。在运算过程中,从右往左逐位进行计算。3-2=1;2不够减6,向前借一后加10变成12;12-6=6;3在上一步被借一所以减为2,2不够减5,…

    2022年9月25日

发表回复

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

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