决战圣地玛丽乔亚Day23---MYSQL性能优化02
解析和预处理验证语法是否合理合法。然后由优化器转换成执行计划。一条查询很多种执行计划都可以返回相同的结果,优化器需要选择一条最优的解。
Mysql使用基于成本的优化器,预测执行计划的成本并选择最优。 可以使用last_query_cost来看当前会话的成本。 数值为优化器认为需要多少次随机IO才能找到数据。不考虑缓存,认为每次数据读取都是一次IO
优化器会进行静态优化和动态优化,动态优化在每次查询都会执行。 静态优化直接对解析树优化,通过一些简单的代数替换等等。动态优化要考虑的因素就有很多
优化器的优化也不是每次都是准确的优化,也有负面优化。
优化器的优化包括:
1.重新定义关联表的顺序(外连接转内连接)
2.对表达式进行等价代换
3.优化Count(),max(),min():
通过索引和列可以优化,索引的左右端就是最大值最小值,执行计划可以移出表用常量值代替。
count(*)在MyIsam中也可以利用MyIsam存储行号的特性来优化。
4.预估并转化为常数表达式
表达式可以转换为常数
用到索引列执行计算操作,可以快速定位到值,看做一个常数
5.覆盖索引扫描(覆盖索引可以直接根据索引返回)
6.子查询优化
7.提前终止查询(limit)
8.等值传播(where条件作用于多个关联在一起的表)
9.列表IN的比较
MySQL将IN()列表中的数据先进行排序,然后通过二分查找的方式来确定列表中的值是否满足条件,这是一个O(log n)复杂度的操作,等价地转换成OR查询的复杂度为O(n),对于IN()列表中有大量取值的时候,MySQL的处理速度将会更快
对于关联查询的执行:
Mysql认为每次查询都是一次关联,关联嵌套的方式进行关联。
MYSQL先在一个表中循环取出单挑数据,然后嵌套循环到一下个表寻找匹配行
这段代码的执行过程是先通过外部循环迭代器遍历满足条件的 tbl1
行,然后在内部循环中,遍历满足条件的 tbl2
行,最后将两个表格中的列进行输出。这种嵌套循环的方式通常用于实现关联查询等场景。
执行计划
关联查询优化器
排序优化

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!