数据库查询流程
- 应用会尝试与MySQL建立一条网络连接,MySQL的连接管理模块会对这条连接进行管理
- Java应用会把SQL语句通过网络连接发送给MySQL
- Mysql收到sql语句之后会在分析器中先判断一下Sql语句有没有语法错误
- 接着是优化器,它会根据一些规则选择改用什么索引
- 之后,执行器会调用存储引擎的接口函数。存储引擎是真正读写数据的地方,目前最常用的是InnoDB
- MyISAM:是一种非事务安全型的存储引擎,不支持外键,采用表级锁,读取性能较好,但在并发写入或需要事务处理的场景下表现不佳。适用于读取密集型的应用场景。
- InnoDB:是一个支持事务安全型的存储引擎,支持外键、行级锁和事务处理,能够保证数据的完整性和一致性。适用于需要事务处理、高并发写入或复杂查询的应用场景。
- InnoDB因为读写磁盘比较慢,所以其内部加了一层内存提速,叫Buffer Pool,里面
影响查询速度的几个因素
索引失效的问题
通过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 子句才能让索引生效,在涉及多个字段的时候,这些字段要么都升序要么都降序,否则索引会失效
其他语句
在关联查询中要使用小表驱动大表
对于子查询,要尽量避免使用子查询
连接数过小:可以多建立一些连接数
- MySql的最大连接数是100,最大可以到达16384
- 应用侧连接数过小
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com