• 约 2 分钟

高性能MySQL

Schema与数据类型优化

  • 选择优化的数据类型
    • 一般原则
      • 越小越好
      • 尽量避免NULL
    • 数据类型
      • 数值
        • 整数
        • 实数
      • 字符串
      • 日期和时间
  • Schema设计中的陷阱
  • 范式和反范式

创建高性能索引

  • 索引的类型
    • B-tree
    • hash
    • R-tree
    • 全文索引
  • 索引的优点(主要是针对B-tree类型的索引)
  • 索引并不是总是好的
  • 高性能的索引策略
    • 独立的列在WHERE中尽量放表达式一侧,不要指望SQL优化器帮你化简表达式
    • 索引选择性与前缀索引
      • 索引选择性指的是列的不同值与行数的比值,范围在1/行数到1之间,越大索引的提升越高
      • 对于长字符串的列(也包括blob等二进制),要在前缀索引与索引选择性之间做取舍
      • 前缀索引
        • 如何确定前缀长度
        • 怎么创建前缀索引
        • 前缀索引的缺点
          • 不适用于ORDER BY和GROUP BY
    • 多列索引
    • 聚簇索引
    • 覆盖索引
    • 索引扫描/索引排序
    • 索引压缩
    • 冗余索引和重复索引
      • 重复索引就是完全一样的索引,必须去重
      • 冗余索引就是有其他索引可以做到冗余的索引的事,比如有了(A,B)就没必要有(A)了
        • 二级索引组合了主键也是一种冗余
        • 冗余有时候也能提升性能
    • 未使用的索引
      • 删
  • 维护索引和表
    • 小技巧:no-op ALTER TABLE
    • 减少索引和数据的碎片

查询性能优化

  • 哪些因素影响查询性能
  • 优化数据访问
    • 只查必要的数据
      • 限制行(通过LIMIT)
      • 限制列
      • 重复的查询可以缓存起来
    • 减少MySQL扫描的数据量
  • 重构查询的方式
    • 复杂查询拆分,充分利用缓存
      • 注意在mysql 8之后query cache被废弃了,所有缓存都给到应用层管理
    • 大查询拆分(主要指数据量)
林威
林威 咖味十足的软件工程师