MySQL数据库学习(三)----慢查询调优sql + 重要语法罗列 + 其它知识点

如何定位并优化慢查询SQL

  1. 根据慢日志定位慢查询sql

慢日志:用来记录执行比较慢的sql

与慢日志有关的三个变量:

  • slow_query_log 标记慢日志的开启和关闭
  • slow_query_log_file 标记慢日志的存储位置
  • long_query_time 当sql执行时间超过这个时间就会被记录到慢日志
  • Slow_queries 记录当前慢查询得到数量,重启数据库后自动清0
#开启慢查询
set global slow_query_log = on;
#设置慢查询时间
set global long_query_time = 1;
#但是需要注意,这种修改在重新连接数据库后设置就会失效,想要永久生效应该去配置文件中修改
  1. 使用explain等工具分析sql

explain可以帮助我们分析查询效率低下的原因

用法,直接在对应查询语句前面加上explain

explain中的关键字段:

  • type (若值为index或者all表明本次查询走得是全表扫描,需要优化)
    在这里插入图片描述- extra(可以获取一些信息,辅助了解语句的执行方式)
    当extra中出现以下两项意味着MySQL根本不能使用索引,效率会受到很大影响:
extra项 说明
Using filesort 表示MySQL会对结果使用一个外部索引排序,而不是从表里按照索引次序读取到相关内容,可能在内存或磁盘上进行排序。MySQL中无法利用索引完成的排序操作称为“文件排序”
Using temporary 表示MySQL在对查询结果排序时使用临时表。常见于排序Order By和分组查询Group by
  1. 修改sql或者尽量让sql走索引(可以添加新索引)
#强制让SELECT走主键索引,通过FORCEC INDEX可以对比各个索引执行时间进行优化
SELECT count(id) FROM user FORCE INDEX(primary);

SQL重点语法

  1. GROUP BY
  • 要满足 “SELECT子句中的列名必须为分组列或列函数”,也就是说SELECT中若进行分组,其选出的结果应该为被分组的列或者是带有sum(),min()等列函数的列。(该条件只针对同一张表成立)
  • 列函数对于GROUP BY子句定义的每个组各返回一个结果
  • WHRER一定要写在GROUP BY的前面
  1. HAVING
  • 通产与GROUP BY子句一同使用
  • WHERE过滤行,HAVING过滤组
  • 出现在同一sql的顺序:WHERE > GROUP BY > HAVING(调换位置会报错)

a. 执行where子句查找符合条件的数据
b. 使用group by 子句对数据进行分组
c. 对group by 子句形成的组运行聚集函数计算每一组的值
d. 最后用having 子句去掉不符合条件的组

  • 在使用HAVING时,如果省略了GROUP BY子句,那么HAVING此时等同于WHERE

MySQL中的五大约束

  • 主键约束(Primay Key Coustraint) 唯一性,非空性
  • 唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
  • 检查约束 (Check Counstraint) 对该列数据的范围、格式的限制
  • 默认约束 (Default Counstraint) 该数据的默认值
  • 外键约束 (Foreign Key Counstraint) 需要建立两表间的关系并引用主表的列

其他知识点补充

  • 通过limit进行分页查询(用法可以自行Google)
  • 主键自增长设置方式:auto_increment
  • ORDER BY的工作方式 :
    直接空降链接:https://www.cnblogs.com/lamp01/p/10770172.html
    这位大哥可以说是在他的博客写得非常详尽了,对于底层得工作流程,以及联合索引等知识都有介绍
发布了22 篇原创文章 · 获赞 23 · 访问量 6284

猜你喜欢

转载自blog.csdn.net/bob_man/article/details/104404891