MySql:sql变慢可能的原因

  1. 数据库查询流程
  2. 影响查询速度的几个因素

数据库查询流程

  1. 应用会尝试与MySQL建立一条网络连接,MySQL的连接管理模块会对这条连接进行管理
  2. Java应用会把SQL语句通过网络连接发送给MySQL
  3. Mysql收到sql语句之后会在分析器中先判断一下Sql语句有没有语法错误
  4. 接着是优化器,它会根据一些规则选择改用什么索引
  5. 之后,执行器会调用存储引擎的接口函数。存储引擎是真正读写数据的地方,目前最常用的是InnoDB
    • MyISAM:是一种非事务安全型的存储引擎,不支持外键,采用表级锁,读取性能较好,但在并发写入或需要事务处理的场景下表现不佳。适用于读取密集型的应用场景。
    • InnoDB:是一个支持事务安全型的存储引擎,支持外键、行级锁和事务处理,能够保证数据的完整性和一致性。适用于需要事务处理、高并发写入或复杂查询的应用场景。
  6. InnoDB因为读写磁盘比较慢,所以其内部加了一层内存提速,叫Buffer Pool,里面

影响查询速度的几个因素

  1. 索引失效的问题

    • 通过explain排除

    • 最左原则,就是我们在使用具有过滤功能的子句(where,on,group by)的时候都会尝试和索引经行匹配。然后回根据最左原则进行匹配,会对照 SQL 语句中要过滤的字段的顺序和索引中字段的顺序。

      比如索引 是 a-b-c 要过滤的字段为:a,a-b,a-b-c 都可以名中索引 , 如果不存在a字段,就无法名中索引

      如果是 a-c 那就只能名中a索引,无法名中c索引

      如果过滤的字段是 c-a 其实同样可以名中a索引,MySQL 的 SQL 优化器调整了解析树,使查询字段符合了索引顺序。但是最好还是按照顺序来

    • where语句使用函数会使索引失效

    • where语句经行范围查询的时候会使范围查询后面的字段失效

    • 所有的不等于操作都会使索引失效:!=,<>,not

    • 使用like进行模糊查询的时候,%或者_ 放在前面会使索引失效

    • 在SQL语句使用类型转换,把数值类型准换成char类型的,会使字符串失效。比如过滤的字节是:where name = 123,name是char类型的字段,而123是数值,这样的情况索引是失效的

    • 在使用排序查询的时候order by 子句需要配合 limit 子句才能让索引生效,在涉及多个字段的时候,这些字段要么都升序要么都降序,否则索引会失效

  2. 其他语句

    • 在关联查询中要使用小表驱动大表

    • 对于子查询,要尽量避免使用子查询

  3. 连接数过小:可以多建立一些连接数

    • MySql的最大连接数是100,最大可以到达16384
    • 应用侧连接数过小

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com

×

喜欢就点赞,疼爱就打赏