查询优化与查询优化器 - 校招总结
作者:佚名 阅读量:次 发表时间:2024-06-10 05:13
以下原理mysql执行器有的有, 有的没有
- 查询重用技术
- 查询重写技术
- 代数优化
- 目标
- 把查询转换为等价的,效率更高的形式
- 把查询重写为等价,简单且不受表顺序限制的形式
- 优化思路:
- 将过程性查询转换为描述性查询(如视图重写)
- 复杂查询(镶套子查询,外连接,嵌套连接)转为多表连接
- 效率低的谓语转换为等价的效率高的谓词
- 利用等式不等式的特性,简化where,having,on条件等
- 查询算法优化
(代数优化/等价转换)
- 子查询上拉 (转为连接)
- from子局
- 子查询作为外查询的查询表
- 相关子查询不能出现在from子局中
- 非相关子查询可以把子查询拉到父层
- 子查询可能执行多次,连接不用执行多次
- 优化器可以根据统计信息来选择不同的连接方法和连接方式
- 子查询中的条件可以转到父查询中,优化器可以对这些条件下推,提高效率
- 子查询优化的方法
- 子查询展开
- 把某类子查询重写为等价的多表连接操作
- SPJ格式中,子查询上拉到上层,方便做多表连接
- 等价谓语重写
- 思想:等价转换sql语句,使之更好的利用索引
- like转换为 大于和小于操作
- between and 转化为大于小于操作
- in 转换为or
- 外连接/嵌套连接消除
- 意义
- 外连接操作比内连接操作容易
- 优化器选择连接顺序时,可以更加灵活
- 满足外连接可以转内连接的条件: 外连接比内连接多的部分为空
- 选择最优的单表扫描方式
- 选择更优的两表连接方式
- 选择更优的多表连接方式
- 查询代价估计
- 索引扫描
- 适用于
- 适用于选择率低的( 0.1 ),数据花费的IO时间会少
- 总体花费会小
- 嵌套循环连接
- 执行原理
- 使用场景
- 适用于:内连接 外连接等
- 适用于外层循环小,内层循环条件列有序
- 排序归并连接算法
- 执行原理
- 要求内外表都有序
- 若连接列有序则可以用索引列排序
- hash连接
- 简单hash连接
- 选一个小表做hash驱动表
- 用另一个表相关的列去匹配
- 使用索引的原则
- 索引列作为条件出现在where,having.on子句中
- 索引列是被连接的表(内表)对象的列存在于连接条件中
- 在索引列上 排序,min max
- 联合索引和多个索引
- 库表结构/存储引擎
- 索引优化
- 查询语句优化
- 缓存层面优化
- 分布式数据库优化
- mysql的话考虑不同的存储引擎
- 范式和反范式权衡
- 数据类型选择
- 通常更小的更好
- 整型和浮点数
- 单浮点,双浮点
- short int long
- 简单就好
- 存储时间尽量用内建类型而不是字符
- 整型比字符代价更低
- 枚举代替字符串
- 字符串在表中换成整数
- 映射存在表中
- 排序会出问题,按照表中数字排序
- 使用要慎重!
- 字符串
- varchar
- 变长字符串
- 使用额外的字节记录字符串长度
- 节省存储空间
- 更新时麻烦
- myisam把行拆成不同片段存储
- innodb分裂页来使行可以放入页中
- 高级
- 索引上的运算会使索引失效
- 索引上的不等于等操作会使索引失效
- 思想
- 更好的利用索引
- 排序中
- 条件选择时
- 仅仅使用最有效的过滤条件
- 选择条件的次序
- 避免空值
- 避免在条件上做运算
- 避免使用不等于操作符.
- 总之:要明白查询优化器做了啥,然后做到查询优化器没做到的,纠正查询优化器做错的!
https://www.cnblogs.com/wangning528/p/6388538.html
- 关联查询代替子查询 - 尽可能只用关联查询代替 - 但不一定会更快,需要测试 - mysql查询优化器做了什么? 又没做什么? - 合理使用EXISTS,NOT EXISTS子句 - 能够用BETWEEN的就不要用IN - 关联子查询
- 临时表提升性能
- 结果集中数据较多时
- 把中间结果写到临时表中
- 尽快释放表锁
- orderby/GroupBy,Distinct优化
- 高可用应用中会有多级缓存
- 上述优化已到瓶颈时,考虑加入缓存层
- mysql缓存