[爬坑日志1]写查询的mysql一些小注意事项

自从做了技术负责人之后,能力的成长真的纯靠摧残啊。:joy:
也没什么心思来写一些文章了,今天还有点时间稍微给大家理一理我曾经遇着过的小坑:alien:,有关 mysql 的查询,也算是给自己整理记录一下。(如果有哪里说的不对的,欢迎指摘 ~)

  1. 第一个坑呢,要从 mysql 的【隐式转换】说起:
    数据库表结构:

【爬坑日志】写查询的mysql一些小注意事项

先用字符串参数直接带入查询:
   public function test1(){
        begin_sql();
        $a = '1855550';//字符串类型
        $b = 1855550;//int 类型
        AcVideoLog::query()->where('user_id',$a)->get();
        dd_sql();
    }
输出结果:

【爬坑日志】写查询的mysql一些小注意事项

总时长:182左右ms

再用 int 参数直接带入查询:
   public function test2(){
        begin_sql();
        $a = '1855550';//字符串类型
        $b = 1855550;//int 类型
        AcVideoLog::query()->where('user_id',$b)->get();
        dd_sql();
    }
输出结果:

【爬坑日志】写查询的mysql一些小注意事项

总时长:200左右ms

数据总量大概 23W 条数据
刚开始有个库表查询特别慢,才发现底下人写了类似这个东西导致一个循环查询直接超2分钟。(库表逻辑都是 ta 写的)接口加载极其慢,然后我阿里云查询出,慢sql 提示我优化,于是我去表里加索引。

加了索引之后,int 类型参数查询:

【爬坑日志】写查询的mysql一些小注意事项

更慢了 ~

加了索引之后,string 类型参数查询:

【爬坑日志】写查询的mysql一些小注意事项

这个索引有效果哈 快了70% ~

于是我又看了眼库,这粗心的家伙,用户id 居然用的 vachar 【警告昂!关联 ID 类型的直接 INT 好吧】,但是还有一个原因呢,就是隐式转换。

当你查询语句的 参数的类型 和你 库表 数据类型 对应的时候,加了索引才会有效果。
这就是mysql 的隐式转换,其实还有其它文章介绍的更仔细,有很多类型的隐式转换介绍,希望大家还是可以多翻翻这些文章《mysql中的隐式转换》www.jianshu.com/p/6f34e9708a80, 还是能获益不少的~

其实呢,这种就是日常中的小细节,你一句底层的查询,所带的参数如果类型没对上,后面的如果业务耦合的时候,需要循环查询,就会导致接口变的非常非常慢,大家可以查一下自己的业务代码中,是不是存在这种代码,尤其是在写 model 中的语句。另外建议大家在 model 中封装查询语句,这样不至于全文搜哪里出了这种细节问题,查起来真的是非常非常非常难受!

本作品采用《CC 协议》,转载必须注明作者和本文链接
小烦
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
小烦

另附上我打印SQL封装的方法

file

/**
 * Notes:开始打印sql
 * User: smaller_fan
 * Date: 2020/7/2
 * Time: 10:06
 */
function begin_sql(){
     \Illuminate\Support\Facades\DB::enableQueryLog();
}

/**
 * Notes:结束打印sql
 * User: smaller_fan
 * Date: 2020/7/2
 * Time: 10:06
 */
function dd_sql(){
    $res = \Illuminate\Support\Facades\DB::getQueryLog();
    $all_time = array_sum(array_column($res,'time'));
    dd(['all_time'=>$all_time,'all_sql'=>$res]);
}
3年前 评论
sunny123456 3年前
小烦 (作者) (楼主) 3年前
sunny123456 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!