获取问题SQL

MySQL

  • 慢查询日志
  • 测试工具loadrunner
  • Percona公司的ptquery等工具

TODO

SQL编写技巧

SQL编写有以下几个通用的技巧:

• 合理使用索引

索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;

一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况

• 使用UNION ALL替代UNION

UNION ALL的执行效率比UNION高,UNION执行时需要排重;UNION需要对数据进行排序

• 避免select * 写法

执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。

• JOIN字段建议建立索引

一般JOIN字段都提前加上索引

• 避免复杂SQL语句

提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理

• 避免where 1=1写法

• 避免order by rand()类似写法

RAND()导致数据列被多次扫描

  • in vs or

对索引字段或非索引字段单个值操作时,两者无异;但是对非索引字段多个值操作,相比in,or效率会随着值的个数增加效率相对下滑

  • group by vs distinct

案例:统计学生表不重复姓名的总数

group by:select count(1) from (select name from student group by name )student_temp

distinct:select count(1) from (select distinct name from student )student_temp

distinct需要将name列中的全部内容都存储在一个内存中,可以理解为一个hash结构,key为col的值,最后计算hash结构中有多少个key即可得到结果,内存消耗可能较大。

而数据库中的group一般使用sort的方法,即数据库会先对name进行排序。而排序的基本理论是,时间复杂为nlogn,空间为1,然后只要单纯的计数就可以了。优点是空间复杂度小,缺点是要进行一次排序,执行时间会较长。

因此选择方案一还是方案二要根据具体的数据而定,一般情况下:

离散型大数据:distinct空间占用较大,在时间复杂度允许的情况下,group 可以发挥空间复杂度优势

集中型大数据:distinct空间占用较小,可以发挥时间复杂度优势

而group by的方式是先将col排序。而数据库中的group一般使用sort的方法,即数据库会先对col进行排序。而排序的基本理论是,时间复杂为nlogn,空间为1.,然后只要单纯的计数就可以了。优点是空间复杂度小,缺点是要进行一次排序,执行时间会较长。

  • like vs in

案例:select count() from student where hobby like ‘%球%’

这个sql作用是统计学生表喜欢球类运动的学生总数

优化方案:select count() from student where hobby in (‘羽毛球’,‘乒乓球’,‘篮球’,‘足球’)

对于一些值集类型的字段,我们可以用in来代替 like

  • 日期函数

案例:select count() yestoday_num from log where date_format(creation_date,’%Y-%m-%d’) = date_sub(curdate() ,interval 1 day )

这个sql用于统计昨天产生的日志条数

优化方案:select count() yestoday_num from log where creation_date between date_add(curdate(), interval -1 day) and curdate();

加索引 ALTER TABLE log ADD INDEX idx_creation_date ( creation_date );

  • 避免在索引列上使用 NOT、 计算,把>=替代>
  • 表连接 替代 exists ; exists 替代 distinct、in ; group by 替代 distinct
  • where子句替换 haveing子句
  • union all 替换union ; union替换or 在是索引的前提下;

文章好文 : https://blog.csdn.net/n950814abc/article/details/85229520

SOME-PROBLEM

在表关联中,类型隐式转换导致索引失效

参考 https://blog.csdn.net/qq_30051265/article/details/104983532

参考:https://blog.csdn.net/jianzhang11/article/details/102867120