码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Mysql优化-经验分享


    目录

        • 什么是索引
        • 索引类型
          • 主键索引
          • 唯一索引
          • 组合索引
          • 前缀索引
          • 全文索引
          • 空间索引
        • 索引的数据结构
          • HASH表
          • 二叉树
          • 平衡二叉树
          • 红黑树
          • B树
          • B+树
        • 索引的存储引擎
          • MyISAM
          • InnoDB
        • 索引优化方向
          • 分层
          • SQL优化
          • 表设计
            • 三范式
            • 索引合理使用
          • 服务器优化
            • 内存升级
            • 碎片优化
          • 工具的使用
            • explain
            • show processlist
            • show profile
            • performance_schema

    先简单介绍一下基础部分

    什么是索引

    1. 帮助MYSQL高效快速获取数据的一种数据结构
    2. 对数据库表中的一列或多列值进行排序

    说明:以空间换取时间 维护索引结构

    索引类型

    主键索引

    primary key

    表数据主键,自动创建索引

    说明:主键必不可少

    唯一索引

    unique key

    索引列数据必须保证唯一,允许为空

    说明:不建议为空,可指定为空字符。因为考虑索引的空间占用:允许为null时,需要额外一个字节保留是否为空。

    组合索引

    多个列组成一个索引

    前缀索引

    文本类型,允许指定索引列的长度

    全文索引

    fulltext key

    用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的INDEX 也可以。

    用法:MATCH(xxx) AGAINST(xxx)

    传送门

    空间索引

    spatial key
    5.7以后支持空间索引,支持OpenGIS几何数据模型

    说明:

    单索引长度限制:5.6里面默认不能超过767bytes,5.7不超过3072bytes

    5.6可以调整配置,放开767长度限制,但是最多也不能超过3072

    传送门

    一般前三种用的比较多,后面三种使用比较少。

    索引的数据结构

    HASH表

    使用key-value键值对方式存储数据。key存储列数据,value存储存储记录或者磁盘地址,点查命中数据

    说明:存在hash冲突,命中地址后,循环链表查询数据

    优点:不考虑hash冲突情况下,时间复杂度为O(1)

    缺点:

    • 不支持范围查询,需要全表扫描完成集合搜索

    • hash冲突之后,时间复杂度变成了O(n)

    二叉树

    每个节点最多两个分支节点且左小右大。使用二分算法查找,减少IO
    优点:理想情况二分查找,减少IO

    缺点:

    • 结构不稳定
    • 数据查找复杂度受树的深度影响
    平衡二叉树

    子树之间高度差不能超过1,通过左旋,右旋保证树平衡

    优点:结构稳定

    缺点:

    • 需要频繁的自旋来保证树结构的平衡,读写性能不平衡
    • 不支持快速范围查询,需要遍历树节点
    • 数据查找复杂度受树的深度影响
    红黑树

    子树之间高度差不能超过2倍,通过左旋,右旋,节点变色保证树平衡

    优点:读写性能接近平衡

    缺点:

    • 不支持快速范围查询,需要遍历树节点
    • 数据查找复杂度受树的深度影响

    传送门

    B树

    所有叶子节点都在同一层的平衡多叉树
    优点:

    • 支持范围查询
    • 数的深度可以控制
    • 数据块利用率较高【16k的数据量:16*16*16=4096】

    不足:mysql数据块使用率还不够高

    传送门

    B+树

    b树的改进版,非叶子节点不存储数据

    优点:

    a.叶子节点存储数据,充分使用了数据块

    b.减少了IO查询,只需要查询叶子节点的数据

    传送门

    算法延时动态演示:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

    索引的存储引擎

    MyISAM

    特点:

    1. 数据与索引是分开存放的,只有非聚簇索引【MYD 数据文件、MYI 索引文件、frm 文件结构[表结构]】
    2. 不支持事务
    3. 不支持主外键
    4. 表锁
    5. …

    传送门

    InnoDB

    特点:

    1. 数据文件与索引放在一起的,聚簇数据结构【frm 文件结构、ibd 数据和索引】
    2. 支持事务
    3. 行锁、表锁
    4. …

    传送门

    image.png

    索引优化方向

    分层
    • 连接层
    • 服务层
    • 引擎层
    • 存储层

    img

    SQL优化
    • 数据点查:等值查询最快

    • 最左匹配原则:组合索引的使用

    • 索引列不做计算:计算索引失效

    • 覆盖索引:非聚簇索引直接返回数据,说明:回表

    • null值判断:非空字段做空判断

    • or导致的索引失效:索引列与非索引列查询导致索引失效

    • 字段类型不匹配:字符类型未做匹配

    • 索引下推:5.6以后新增

    • group by:临时表、文件排序

    表设计
    三范式
    1. 第一范式:所有列不存在再次重复拆分
    2. 第二范式:非主键列和主键完全依赖
    3. 第三范式:所有列和主键直接依赖

    传送门

    注:三范式按实际情况来,不一定要全部满足,比如有时候适当冗余字段比连表查询效果更好。

    索引合理使用
    1. 数据量较小的表不适用索引
    2. 频繁更新的列不合适用索引
    3. 重复度较高的列不适合索引【*】
    4. 关联查询字段创建索引

    注:第三条还是得按实际情况来,有时候加上确实比不加要快。

    服务器优化
    内存升级

    cache缓存块、数据集过滤都依赖内存

    碎片优化

    数据删除会造成不连续的空白空间

    传送门

    工具的使用
    explain

    SQL执行计划,优化SQL

    传送门

    show processlist

    查询SQL执行情况

    传送门

    show profile

    查看执行耗时

    传送门

    performance_schema

    传送门
    /1093229)

  • 相关阅读:
    MySql
    Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    当resource bundle 的多语言文件里包含引号'时
    对话系统实战:基于DualEncoder实现对话系统详细教程
    JOSEF约瑟 漏电继电器 JHOK-ZBG1 φ25mm AC220V 0.1A/0.1S 分体式
    Spring的RestTemplate学习
    Linux安装docker详细步骤
    什么是同步容器和并发容器的实现?
    淘宝店铺订单交易接口/淘宝店铺商品上传接口/淘宝店铺订单解密接口/淘宝店铺订单明文接口/淘宝店铺订单插旗接口代码对接分享
    P4 开发实践 — 编程基础 — 代码开发流程示例
  • 原文地址:https://blog.csdn.net/z55947810/article/details/127986559
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号