执行过程的优化
1、查询缓存
2、查询优化处理 :
A、语法解析器和预处理
B、查询优化器 CBO(成本)、RBO(规则):
(1)、select count(*)from film_actor;show status like ‘last_query_cost’;可以看到这条查询语句大概需要做1104个数据页才能找到对应的数据,这是经过一系列的统计信息计算来的
a、每个表或者索引的页面个数
b、索引的基数
c、索引和数据行的长度
d、索引的分布状况
(2)、在很多情况下 mysql会选择错误的执行计划,原因如下:
a、统计信息不准确
b、执行计划的成本估算不等于实际的执行的成本
c、mysql的最优可能跟你想的不一样
d、mysql不考虑其他并发执行的查询
e、mysql不会考虑不受其控制的操作成本(存储过程、自定义函数)
(3)、优化器的优化策略
a、静态优化 直接对解析树进行优化,并完成优化
b、动态优化 动态优化与查询的上下文有关,也可能跟取值、索引对应的行数有关
c、mysql对查询的静态优化只需要一次,但对动态优化在每次执行时都需要重新评估
(4)、优化器的优化类型
a、重新定义关联表的顺序
b、将外连接转化为内连接,内连接的效率要高于外连接
c、使用等价变换规则,mysql可以使用一些等价变化规则来简化并规划表达式
d、优化count()、min()、max()
e、预估并转化为常数表达式,当一个mysql检测到一个表达式可以转化为常数的时候,就会一直把该表达式作为常数进行处理
f、索引覆盖扫描,当索引中的列包含所有查询中需要使用的列的时候,可以使用覆盖索引
g、子查询优化
h、等值传播
(5)、关联查询 JOIN的实现方式原理
(6)、排序优化 排序算法
a、两次传输排序 占空间小
b、 单次传输排序 占空间大
c、当需要排序的列的总大小加上orderby的列大小超过max_length_for_sort_data定义的字节,mysql会选用双次排序,反之使用单次排序,当然,用户可以设置此参数的值来选择排序的方式