码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL进阶04_索引_索引使用_索引设计原则


    文章目录

        • 六、索引使用
          • 一、索引失效
            • 最左前缀法则
            • 范围查询
            • 索引列运算
            • 字符串不加引号
            • 模糊查询
            • or连接的条件
            • 数据分布影响
          • 二、SQL提示
          • 三、覆盖索引
            • 思考
          • 四、前缀索引
        • 七、索引设计原则

    六、索引使用

    -- 10000000条数据
    select * from tb_sku where sn = '1200230'  //10几秒
    --加索引
    create index idx_sku_sn on tb_sku(sn);  //也是执行很久,要给每个sn字段加
    --再查询
    select * from tb_sku where sn = '1200230'  //0.多秒
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    一、索引失效

    最左前缀法则
    如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效)。
    
    profession字段必须存在,跟where后的位置没关系
    
    • 1
    • 2
    • 3
    -- 为profession gae status创建联合索引
    create index idx_user_pro_age_sta on tb_user(profession,gae,status);
    
    • 1
    • 2

    在这里插入图片描述

    范围查询
    联合索引中,出现> < ,范围查询 右侧的列索引失效
    
    --解决方案
    如果业务允许的情况下,尽量使用>= 或 <=
    
    • 1
    • 2
    • 3
    • 4
    索引列运算
    • 不要在索引列上进行运算操作,索引将失效
    --例(查询手机号后两位是15,就不会走索引) 
    explain select * from tb_user where substring(phone,10,2) = '15';
    
    • 1
    • 2
    字符串不加引号
    • 字符串类型字段使用时,不加引号,索引将失效
    --例
    explain select * from tb_user where phone = 12341311915;
    explain select * from tb_user profession='软件工程' and age=31 and status=0;
    
    • 1
    • 2
    • 3
    模糊查询
    • 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
    --例
    explain select * from tb_user profession like '软件%'  -- 没有失效
    explain select * from tb_user profession like '%工程'  -- 失效
    explain select * from tb_user profession like '%工%'   -- 失效
    
    • 1
    • 2
    • 3
    • 4
    or连接的条件
    • 用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
    --例 id有索引 age没有索引
    explain select * from tb_user where id=1 or age=23;  --没有使用索引
    
    • 1
    • 2

    解决方法

    --由于age没有索引,所以即使id、phone有索引,索引也会失效。所以需要针对于age也要建立索引。
    create index idx_user_age on tb_user(age);
    
    • 1
    • 2
    数据分布影响
    mysql索引使用率监控技巧(值得收藏!)
    pdf 0星 超过10%的资源 171KB
    下载
    • 如果MySQL评估使用索引比全表更慢,则不使用索引
    --例 绝大多数phone数据大于13132131333 ,就不会走索引了
    explain select * from tb_user where phone >= '13132131323'; 
    explain select * from tb_user where phone >= '13132131333'; 
    
    -- 如果表中大部分phone不为null,就不走索引
    explain select * from tb_user where phone is null;
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、SQL提示

    场景

    表中有profession的联合索引,还有profession的单列索引,查询会走哪个索引?

    在这里插入图片描述

    use index 建议 ,MySQL自己决定 ,force index 强制

    三、覆盖索引

    • 尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *。

    场景:索引有id profession age status

    在这里插入图片描述

    在这里插入图片描述

    为什么尽量不要用select * , 因为会很容易出现回表查询

    思考
    Mysql使用索引的正确方法及索引原理详解
    pdf 0星 超过10%的资源 584KB
    下载

    在这里插入图片描述

    解答:
    给username和password建立一个联合索引,避免回表,因为联合索引下面挂着的就是id
    
    • 1
    • 2

    四、前缀索引

    • 当字段类型为字符串(varchar,, text等),时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘O,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。

    语法

    create index idx_xxx on table_name(column(n))

    在这里插入图片描述

    在这里插入图片描述

    • 单列索引与联合索引
      • 单列索引:即一个索引只包含单个列
      • 联合索引:即一个索引包含了多个列
    在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引,而非单列索引。
    
    避免查询的字段没有索引,造成回表查询
    
    • 1
    • 2
    • 3

    七、索引设计原则

    在这里插入图片描述

  • 相关阅读:
    TSINGSEE青犀视频:城市道路积水智能监管,智慧城市的守护者
    python中,reshape 用法
    基于ElementUI将input、select以及date-picker等组件进行封装,提升表单页面效率以及配置化
    JZ86 在二叉树中找到两个节点的最近公共祖先
    抽象的代理模式1.0版本
    高压放大器有哪些实际应用场景
    Python爬虫入门篇学习记录
    Spring 源码分析(四)——Spring 如何解决循环依赖
    工具类-Queue、Deque类总结
    【RocketMQ中生产者生产消息的高可用机制、消费者消费消息的高可用机制、消息的重试机制、死信队列于死信消息】
  • 原文地址:https://blog.csdn.net/xixihaha_coder/article/details/126199948
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号