mysql关联查询
参考:https://blog.csdn.net/lu0422/article/details/78892497
mysql查询慢的原因
- 记录慢查询日志
分析查询日志,不要直接打开慢查询日志进行分析,这样比较浪费时间和经历,可以使用pt-query-digest工具进行分析 - 使用show profile
set profileing = 1;开启,服务器上执行所有语句会检测消耗的时间,存到临时表中
show profiles
show profile for query Query_ID
show profiles 查看所有查询消耗 的时间
show profile for query Query_ID 查看某一条语句查询的具体消耗时间;
- 使用show status
show status会返回一些计数器,show global status 查看服务器级别的所有计数
有时根据这些计数,可以猜测出那些操作代价较高或消耗时间多 - show processlist
观察是否有大量线程处于不正常的状态或特征 - explain
分析单条的SQL语句
mysql查询优化的方式
- 访问数据太多会导致查询性能下降(不要用select *)
- 确定MySQL服务器是否在分析大量不必要的数据行
- 确定应用程序是否在检索大量超过需要的数据,可能是太多行或列
- 避免使用如下SQL语句
- 查询不需要的数据,使用limit解决
- 所表关联返回全部列,制定A.id,A.name,B.age
- 总是取出全部列,SELECT * 会让优化器无法完成索引覆盖扫描的优化
- 重复查询相同的数据,可以缓存数据,下次直接读取缓存
- 是否在扫描额外的记录
- 使用explain来进行分析,如果发现查询需要扫描大量的数据但是只返回少数行可以用如下技巧去优化:
- 使用索引覆盖扫描,把所有用的列都放在索引中,这样存储引擎不需要回表获取对应行就可以返回结果
- 改变数据库的表的结构,修改数据表范式(如果经常需要关联查询,可将另一张表的字段冗余地存储在要查询的表中,以空间换取时间)
- 重写SQL语句,让优化器可以以更优的方式执行查询
- 使用explain来进行分析,如果发现查询需要扫描大量的数据但是只返回少数行可以用如下技巧去优化:
- 优化长难的查询语句
- 切分查询
将一个大的查询分为多个小的相同的查询 - 分解关联查询
可以将一条关联查询分解成多条SQL来执行,可以让缓存的效率更高,执行单个查询可以减少锁的竞争,在应用层做关联可以更容易对数据进行拆分,查询效率会有大幅提升,较少冗余记录的查询
- 切分查询
- 优化特定类型的查询语句
- 优化count()查询
- count(*)中的*会忽略所有的列,直接统计所有列数,因此不要使用count(列名)
- MyISAM中,没有任何WHERE条件的count(*)非常快,当有WHERE条件时,MyISAM的count统计不一定比其他表引擎快
- 可以使用explain查询近似值,用近似值代替count(*)
- 增加汇总表
- 使用缓存
- 优化关联查询
-
确定ON 或者 USING子句的列上有索引
Mysql 中联接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name。
当模式设计对联接表的列采用了相同的命名样式时,就可以使用 USING 语法来简化 ON 语法,格式为:USING(column_name)。 - 确保GROUP BY 和 ORDER BY中只有一个表中的列,这样MySQL才能使用索引
-
- 优化子查询
- 用关联查询替代
- 优化GROUP BY 和 DISTINCT
- 这两种查询均可以使用索引来优化,是最有效的优化方法
- 关联查询中,使用表示列进行分组的效率会更高(尽量使用主键、自增列等)
- 如果不需要ORDER BY ,进行GROUP BY 时使用ORDER BY NULL ,mysql不会再进行文件排序
- 优化LIMIT分页
- LIMIT偏移量大时,查询效率低
- 可以记录上次查询的最大ID,下次查询时直接根据该ID来查询
- 优化UNION查询
- UNION ALL查询效率高于UNION
- 优化count()查询
引用的连接:https://www.cnblogs.com/clannadxr/p/7806090.html
引用的连接:https://blog.csdn.net/qq_35571554/article/details/82800463