一、优化基本原则:优化数据访问
1.向服务器请求了不需要的数据
提取超过需要的列
多表联接时提取所有列
提取所有列
2.Mysql检查了太多数据吗?
执行时间
检查的行数
返回的行数
Explain的type列包括全表扫描(Full Table Scan)、索引扫描(Index Scan)、范围扫描(Range Scan)、唯一索引查找(Unique Index Scan)和常量(Constant),访问他们的速度依次递增。
二.重构查询的方式
1.复杂查询和多个查询
2.缩短查询
3.分解查询
什么时候在应用程序端进行联接效率更高
可以缓存早期查询的大量数据;使用来多个MyISAM表;数据分布在不同的服务器上;对于大表使用IN()替换联接;一个联接引用了同一个表很多次;
三、查询执行基础知识
1.MySql客户端/服务器协议
2.查询缓存
3.查询优化过程
基数性(Cardinality)用于衡量表中某列数据之间的唯一性。基数性越低,说明该列数据的重复性越高,反之则说明数据的重复性越低。
last_query_cost
Straight_join
4.查询执行引擎
5.返回结果到客户端
四、MySql查询优化器的限制
1.关联子查询(Correlated Subqueries)
什么时候选择关联子查询
五、优化特点类型的查询
1.优化count
2.优化联接
3.优化子查询
对子查询最重要的建议就是尽可能地使用联接
4.优化GROUP BY和DISTINCT
通常索引也是优化他们的最重要的手段
当不能使用索引是,Mysql有两种优化Group by的策略:使用临时表或文件排序进行分组。可以使用SQL_SMALL_RESULT强制MySql选择临时表;SQL_BIG_RESULT强制MySql使用文件排序
5.使用ROLLUP优化GROUP BY
6.优化LIMIT和OFFSET.
7.优化Sql_CALC_FOUND_ROWS
8.优化联合
六、查询优化提示
High_PRIORITY
LOW_PRIORITY
DELAYED
STRAIGHT_JOIN
SQL_SMALL_RESULT和SQL_BIG_RESULT
SQL_BUFFER_RESULT
SQL_CACHE和SQL_NO_CACHE
SQL_CALC_FOUND_ROWS
FOR UPDATE和LOCK IN SHARE MODE只针对行级锁的存储引擎
USE INDEX、IGNORE INDEX和FORCE INDEX
Optimizer_search_depth
Optimizer_prune_level
七、用户定义变量