[爬坑日志1]写查询的mysql一些小注意事项
自从做了技术负责人之后,能力的成长真的纯靠摧残啊。
也没什么心思来写一些文章了,今天还有点时间稍微给大家理一理我曾经遇着过的小坑,有关 mysql 的查询,也算是给自己整理记录一下。(如果有哪里说的不对的,欢迎指摘 ~)
先用字符串参数直接带入查询:
public function test1(){
begin_sql();
$a = '1855550';//字符串类型
$b = 1855550;//int 类型
AcVideoLog::query()->where('user_id',$a)->get();
dd_sql();
}
输出结果:
总时长:182左右ms
再用 int 参数直接带入查询:
public function test2(){
begin_sql();
$a = '1855550';//字符串类型
$b = 1855550;//int 类型
AcVideoLog::query()->where('user_id',$b)->get();
dd_sql();
}
输出结果:
总时长:200左右ms
数据总量大概 23W 条数据
刚开始有个库表查询特别慢,才发现底下人写了类似这个东西导致一个循环查询直接超2分钟。(库表逻辑都是 ta 写的)接口加载极其慢,然后我阿里云查询出,慢sql 提示我优化,于是我去表里加索引。
加了索引之后,int 类型参数查询:
更慢了 ~
加了索引之后,string 类型参数查询:
这个索引有效果哈 快了70% ~
于是我又看了眼库,这粗心的家伙,用户id 居然用的 vachar 【警告昂!关联 ID 类型的直接 INT 好吧】,但是还有一个原因呢,就是隐式转换。
当你查询语句的 参数的类型 和你 库表 数据类型 对应的时候,加了索引才会有效果。
这就是mysql 的隐式转换,其实还有其它文章介绍的更仔细,有很多类型的隐式转换介绍,希望大家还是可以多翻翻这些文章《mysql中的隐式转换》www.jianshu.com/p/6f34e9708a80, 还是能获益不少的~
其实呢,这种就是日常中的小细节,你一句底层的查询,所带的参数如果类型没对上,后面的如果业务耦合的时候,需要循环查询,就会导致接口变的非常非常慢,大家可以查一下自己的业务代码中,是不是存在这种代码,尤其是在写 model 中的语句。另外建议大家在 model 中封装查询语句,这样不至于全文搜哪里出了这种细节问题,查起来真的是非常非常非常难受!
本作品采用《CC 协议》,转载必须注明作者和本文链接
另附上我打印SQL封装的方法