这个里面我准备记录一些比较有意思的MySQL的指令和函数,当然使用函数的时候我们要注意,会不会因为函数导致不走索引,走全表扫描的情况。
因为对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。如果不是索引字段的话其实还好,毕竟MySQL里面会有不少buffer,比如sort buffer这些,实际上是在内存上操作(当然太多了也会走磁盘),其实也挺快的。
一 指令
show processlist
有时候会出现长时间查询不返回结果,我们想知道到底是什么情况。可以通过show processlist来查看。
这里要注意的是id指的是pid,我们发现阻塞的进程直接kill pid就可以。还有就是show processlist 内容会提示我们关于阻塞的信息,比如:Waiting for table metadata lock 就是在等MDL锁。
二 函数
1 IFNULL(XXX,xxx)
我们对于一些NULL值其实在SQL里进行处理赋值,可以没必要到代码里面去遍历。
举个例子比如我们希望对某个字段求和,如果是null的话怪怪的,可以将这个null值赋值为0.
SELECT
abaod.id,
abaod.res_id,
abaod.res_name,
abaod.res_code,
abaod.back_apply_order_id,
abaod.back_apply_order_no,
abaod.category_id,
abaod.category_name,
abaod.brand,
abaod.model,
abaod.batch_id,
ab.batch_no,
abaod.out_storage_id,
abaod.out_storage_detail_id,
abaod.apply_count,
abaod.out_storage_id,
abaod.out_storage_detail_id,
aos.out_storage_code,
IFNULL(SUM(abod.count),0) AS back_count,
(abaod.apply_count - IFNULL(SUM(abod.count),0)) as could_back_count
FROM
ams_back_apply_order_detail abaod
LEFT JOIN ams_back_apply_order abao ON abao.id = abaod.back_apply_order_id AND abao.data_status = 1
LEFT JOIN ams_back_order_detail abod ON abod.back_apply_order_detail_id = abaod.id
LEFT JOIN ams_batch ab ON abaod.batch_id = ab.id
LEFT JOIN ams_back_order abo ON abo.id = abaod.back_apply_order_id AND abo.data_status = 1 AND abo.back_order_status IN (1,2)
LEFT JOIN ams_out_storage aos ON aos.id = abaod.out_storage_id
GROUP BY abaod.id
2 GROUP BY 和 ORDER BY
这俩是有顺序的,GROUP BY 在ORDER BY前面。其实很好理解就是先分组组合获得结果集,才能利用sort buffer对现有的的结果集进行排序。
注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。