博客
关于我
mysql基本知识点梳理和查询优化
阅读量:805 次
发布时间:2023-02-12

本文共 1703 字,大约阅读时间需要 5 分钟。

MySQL数据库优化指南

一、索引相关

索引是数据库查询性能的重要因素,但并非所有情况都适合使用。索引的基数是数据列中不同值的数量,基数越高,索引越有用。例如,包含多个不同年龄值的字段,索引会显著提升查询效率。而性别字段(如仅有“M”和“F”)由于值重复率高,索引的帮助不大,甚至可能引发全表扫描。

索引失效原因

  • 运算类型不支持:对索引列进行运算如加、减、乘、除、逻辑运算、模运算等,索引会失效。
  • 类型不匹配:将varchar字段用于number类型的where条件,索引会被忽略。
  • 函数应用:对索引字段应用函数(如ROUND()),需要建立基于函数的索引。MySQL 8.0支持直接索引函数字段,5.7可通过虚拟列实现。
  • OR条件优化:OR条件即使有索引,也可能无法使用。建议避免OR条件,若必须使用,需为每个列建立索引。
  • 字符串类型:未使用引号的字符串字段索引失效。
  • 位图索引is nullis not null索引会失效。
  • 组合索引:遵循最左原则,确保索引字段顺序与查询条件一致。
  • 二、EXPLAIN分析

    基本用法

    • 使用DESCEXPLAIN分析SQL语句。
    • 使用EXPLAIN extended查看实际执行计划,分析查询性能。

    性能优化特性

  • 覆盖索引:查询数据已在索引中找到,避免回表访问。
  • Index Condition Pushdown (ICP):部分where条件可下推到存储引擎,提升查询效率。
  • 索引合并:多个索引分别查询,合并结果以提高效率。
  • 临时表和文件排序:使用临时表优化排序和分组查询。
  • 查询状态
    • Using index:覆盖索引。
    • Using filesort:MySQL无法利用索引排序。
    • Using temporary:查询涉及排序操作。
    • impossible wherewhere条件总是错误,无法获取数据。
    • select optimized away:优化了MIN/MAXCOUNT(*)操作。
    • distinct:优化distinct操作,早止重复值查找。
    • type
      • system:系统表,常见于const类型。
      • const:主键或唯一索引扫描。
      • eq_ref:唯一性索引扫描。
      • ref:非唯一性索引扫描。
      • range:基于范围条件的扫描。
      • index:全表索引扫描。
      • all:全表扫描。
  • 三、字段类型和编码

    字段类型

    • 字符串编码
      • utf8:最大支持3个字节,不支持emoji,需使用utf8mb4
      • utf8mb4:支持emoji,需在配置文件中指定客户端字符集,并在连接池中设置初始化SQL。
    • 排序规则
      • utf8_general_ci:大小写不敏感。
      • utf8_bin:区分大小写,常用于区分大小写敏感的场景。

    四、SQL语句总结

    常用但容易忘的语句

  • 插入忽略冲突INSERT IGNORE INTO
  • 更新或插入INSERT ... ON DUPLICATE KEY UPDATE
  • 替代插入REPLACE INTO
  • 备份表CREATE TABLE ... SELECT ...
  • 复制表结构CREATE TABLE ... LIKE ...
  • 锁相关
    • 共享锁:LOCK IN SHARE MODE
    • 排它锁:FOR UPDATE
  • 强制索引FORCE INDEX
  • 禁用缓存SQL_NO_CACHE
  • 查询优化

    • 延迟关联:避免回表操作,适用于分页。
    • 避免多表join:尽量少于3个表关联。

    注意事项

    • where顺序:从右到左解析条件,优先使用where而非having
    • distinct性能:通过group by优化。
    • 连表查询:避免复杂的join操作。

    五、踩坑

  • 自增列处理truncate会重置自增基数。
  • 聚合函数滤空SUM(NULL)返回NULL而非0。
  • NULL处理a = null永远为false,正确写法为a is null
  • 在线修改:大表修改需使用pt-online-schema-change工具。
  • 通过以上优化,数据库性能将得到显著提升,建议结合实际业务场景,合理设计索引和查询策略,避免常见问题。

    转载地址:http://phbfk.baihongyu.com/

    你可能感兴趣的文章
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0_Postgresql和Mysql同时指定库_指定多表_全量同步到Mysql数据库以及Hbase数据库中---大数据之Nifi工作笔记0060
    查看>>
    NIFI1.21.0最新版本安装_连接phoenix_单机版_Https登录_什么都没改换了最新版本的NIFI可以连接了_气人_实现插入数据到Hbase_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0最新版本安装_配置使用HTTP登录_默认是用HTTPS登录的_Https登录需要输入用户名密码_HTTP不需要---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增加修改实时同步_使用JsonPath及自定义Python脚本_03---大数据之Nifi工作笔记0055
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_插入修改删除增量数据实时同步_通过分页解决变更记录过大问题_01----大数据之Nifi工作笔记0053
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现update数据实时同步_实际操作05---大数据之Nifi工作笔记0044
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_不带分页处理_01_QueryDatabaseTable获取数据_原0036---大数据之Nifi工作笔记0064
    查看>>