Mysql(四)查询性能优化

时间:2021-12-08 07:35:12

一、优化基本原则:优化数据访问

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

七、用户定义变量