LOADING

2019年5月

首先需要修改php-fpm配置文件
vim /etc/php-fpm.d/www.conf 一般修改vim /etc/php-fpm.conf即可
去掉request_slowlog_timeout 、slowlog的前缀分号';'
设置request_slowlog_timeout =2;

设置完毕
之后需要重启php-fpm
ps aux | grep php-fpm
获取到主进程号
菜皮.png

kill -USR2 第一个进程号 master 就可以了
然后去/var/log/php-fpm/www-slow.log (或者你自己设置的地方进行查看)

用的两张表关联主表 49609 副表 数据35352
首先是子查询的代码 用的laravel自带orm

$student = Student::doesntHave('hasBanjiStudents')->get();
//变成mysql语句是
select * from `tbl_students` where not exists (select * from `tbl_banji_students` where `tbl_students`.`id` = `tbl_banji_students`.`student_id`) and `tbl_students`.`deleted_at` is null
//耗时时间 0.270s

接下来有请join闪亮登场

 $student = Student::leftJoin('banji_students','students.id','=','banji_students.student_id')
                ->select('students.*','banji_students.banji_id')
                ->where('banji_students.banji_id',null)
                ->get();
//变成sql语句是
select `tbl_students`.*, `tbl_banji_students`.`banji_id` from `tbl_students` left join `tbl_banji_students` on `tbl_students`.`id` = `tbl_banji_students`.`student_id` where `tbl_banji_students`.`banji_id` is null and `tbl_students`.`deleted_at` is null
//耗时0.169s

上网查了一下, laravelorm基本都基于子查询, 而子查询在使用中会建立一张临时表进行数据排序等,而join则不会,所以子查询又慢又占用内存

$link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
                    ->get();

//打印写法故意写错select
$link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->select('asdasd')
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
                    ->get();

当数据库表中数据过3w之后inRandomOrder用起来就十分的慢还占用内存,现数据50w.
explan之后发现查询速度为0.32

解决方案

        $rand_arr = [];
        for ($i=0;$i<100;$i++){
            $rand_arr[] = mt_rand(500,10000);
        }
 $link_popular_record_false = Student::whereNotIn('id',$temp_link_popular)
                    ->whereIn('id',$rand_arr)
                    ->limit($limit-$link_count)
//                    ->inRandomOrder()
                    ->get();

用whereIn进行主键筛选就可以了 修改后查询效率为0.0026