繁体   English   中英

如何使用慢 Order By 优化 MYSQL 查询

[英]How to optimize MYSQL Query with slow Order By

我正在尝试优化我的 MYSQL 查询。 我在数据库中只有 2k 行,但是查询需要将近 1,5 - 2 秒。 由于 Laravel 应用程序中执行的其他查询,此查询的平均加载页面需要很长时间才能获得良好的用户体验。

当我删除订单时,查询只需要 0.03 秒。

select * 
from `companies` 
     left join `model_has_status` on `companies`.`id` = `model_has_status`.`company_id` 
     left join `statuses` on `model_has_status`.`status_id` = `statuses`.`id`
where `model_has_status`.`status_id` = (select `status_id` 
                                        from `model_has_status` 
                                        where `company_id` = `companies`.`id` 
                                        order by `created_at` desc 
                                       limit 1) 
       and `companies`.`deleted_at` is null 
order by companies.`active_name` asc 
limit 30 offset 0

Mysql 解释有以下输出: MYSQL解释截图

我试图在companys.active_name 上添加索引。 然而这无济于事。 谁能给我指点一下优化什么?

为了完整起见,这是我从应用程序执行的 Laravel 查询:

$companies = QueryBuilder::for(Company::class)
            ->leftjoin('model_has_status', 'companies.id', 'model_has_status.company_id')
            ->leftjoin('statuses', 'model_has_status.status_id', 'statuses.id')
            ->allowedFilters([
                AllowedFilter::custom('status', new FilterCompanyStatus()),
            ])
            ->where('model_has_status.status_id', function ($query) {
                $query->select('status_id')
                    ->from('model_has_status')
                    ->whereColumn('company_id', 'companies.id')
                    ->orderByDesc('created_at')
                    ->limit(1);
            })
            ->defaultSort('active_name')
            ->paginate(30);

感谢评论,我对数据库的内部工作做了更多调查。 我已经能够将查询结果从平均 1.8 秒优化到 0.05 秒!

该查询调用了三个不同的表:

-Companies
*id
*active_name

-Model_has_status
*company_id
*status_id
*created_at

-Status
*id
*name

在最初的问题中,我只向 company.active_name 添加了一个索引。 这根本没有提高速度。 但是,当我为所有提到的字段添加索引时,查询显着改善。

为了完整起见,我只是通过以下 Laravel 迁移来添加索引。

Schema::table('companies', function (Blueprint $table) {
            $table->index('active_name');
        });

        Schema::table('model_has_status', function (Blueprint $table) {
            $table->index('status_id');
            $table->index('company_id');
            $table->index('created_at');
        });

        Schema::table('statuses', function (Blueprint $table) {
            $table->index('id');
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM