我面临着MySQL查询的性能问题,即使是索引所需的列,等等……加载10个第一结果需要超过5秒,这是由于ORDER BY个,当我删除它时,只需要几毫秒就可以加载!

以下是SQL查询:

select
    *
from
    `feedbacks` f
inner join carriers c on c.id = f.carrier_id 
where
    c.id in (25619, 25620, 25621, 25637, 25758, 25759, 25760, 25761, 25762, 25763, 25976, 25983, 26459, 26460, 27003, 27006, 27052, 27295, 27325, 27387, 27532, 27533, 27534, 27535, 27536, 27537, 27538, 27541, 27542, 27543)
    and f.`deleted_at` is null
order by
    f.`created_at` desc
limit 10 offset 0

feedbacks表上有一些索引:

feedbacks_status_id_foreign BTREE   FALSE   status_id
feedbacks_push_id_foreign   BTREE   FALSE   push_id
feedbacks_created_at_index  BTREE   FALSE   created_at
feedbacks_carrier_id_created_at_token_index BTREE   FALSE   carrier_id,created_at,token
feedback_test_index BTREE   FALSE   created_at,carrier_id
PRIMARY BTREE   TRUE    id

carriers张表中:

idx_creator_id  BTREE   FALSE   creator_id
carriers_team_id_foreign    BTREE   FALSE   team_id
carriers_slug_unique    BTREE   TRUE    slug
carriers_slug_organization_id_created_at_index  BTREE   FALSE   slug,created_at
PRIMARY BTREE   TRUE    id

但即使有了所有这些索引,也需要很长时间!

欢迎就此问题提供更多帮助:d

推荐答案

诀窍是找到问题中的行的ID,then获取额外的列.这避免了拖着大量的垃圾,通过分类等,并可能允许使用"覆盖"索引:

select  f2.*, c.*
    FROM  (
        SELECT  f.id
            FROM  `feedbacks` f
            WHERE  f.carrier_id in (25619, 25620, 25621, 25637, 25758,
                        25759, 25760, 25761, 25762, 25763, 25976, 25983, 26459,
                        26460, 27003, 27006, 27052, 27295, 27325, 27387, 27532,
                        27533, 27534, 27535, 27536, 27537, 27538, 27541, 27542,
                        27543 
                          )
              and  f.`deleted_at` is null
            order by  f.`created_at` desc
            limit  10 offset 0 
          ) AS f1
    JOIN  carriers AS c  ON c.id = f1.carrier_id
    JOIN  feedbacks AS f2  ON f2.id = f1.id
    ORDER BY  f2.`created_at` desc  -- yes, repeated
    ;    

有:

feedbacks:  INDEX(deleted_at, carrier_id, created_at,  id)

Mysql相关问答推荐

如何在循环查询中删除默认架构?

MySQL在使用SELECT*时不使用索引

SQL不断返回查询失败,并且不知道从这里到哪里go

为什么歌曲详细信息未显示在 Liked.handlebars 视图中?

如何通过SQL来计算到达特定值的行的数量

在MySQL查询中查找和替换表内的值

关于设置为 NOT NULL 时的 CHAR 默认值

如何将数据导入MySQL中的master/replica struct

为什么 `count` 函数有效但 `sum` 无效?

如何编写一个查询,计算表中每个日期的一个日期加上前 4 天的记录数?

Mysql 中相同列的相关 2 查询

MYSQL:如何根据之前的相关记录获取记录

MySQL REGEXP 在没有 BINARY 模式的情况下区分大小写?

为什么 ORDER BY 'id' 'desc' 不返回语法错误?

判断一对记录是否属于多个组ID

如何在 MySQL 上一次删除一系列记录?

mysql 按日期 Select 总和组

MySQL:在 Select 语句中自动增加临时列

在 Mac 上设置 Laravel php artisan migrate 错误:没有这样的文件或目录

ON UPDATE RESTRICT 有什么作用?