微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Mysql 限制偏移量因偏移值大而减慢

如何解决Mysql 限制偏移量因偏移值大而减慢

我的查询需要很多时间 80 秒、70 秒等。我正在使用索引,但不知道哪个索引对我的查询有用。当用户直接传递页码页码 2500,5000 时,此查询会变慢

SELECT candidate.candidate_id AS candidateID,candidate.candidate_id AS exportID,candidate.is_hot AS isHot,candidate.date_modified AS dateModifiedSort,candidate.date_created AS dateCreatedSort,candidate.candidate_id AS candidate_id,attachment_id,IF(candidate_joborder_submitted.candidate_joborder_id,1,0) AS submitted,IF(attachment_id,0) AS attachmentPresent,candidate.first_name AS firstName,candidate.last_name AS lastName,candidate.key_skills AS keySkills,DATE_FORMAT(candidate.date_modified,'%m-%d-%y') AS dateModified,candidate.email1 AS email1,candidate.phone_home AS phoneHome
 FROM
       candidate
       LEFT JOIN attachment 
       ON candidate.candidate_id = attachment.data_item_id
       AND attachment.data_item_type = 100
       LEFT JOIN candidate_joborder AS candidate_joborder_submitted
       ON candidate_joborder_submitted.candidate_id = candidate.candidate_id
       AND candidate_joborder_submitted.status >= 400
       AND candidate_joborder_submitted.site_id = 1
       AND candidate_joborder_submitted.status != 650 
       LEFT JOIN saved_list_entry
       ON saved_list_entry.data_item_type = 100
       AND saved_list_entry.data_item_id = candidate.candidate_id
       AND saved_list_entry.site_id = 1
       WHERE candidate.site_id = 1
       ORDER BY candidate.email1 DESC
       LIMIT 119985,15

解释查询

EXPLAIN QUERY

解决方法

无法确定索引的确切组件。但是,建议如下。表上特定的多列索引应该有助于提高性能。

it

使用更短的表别名和可读性稍微重写您的查询。还在连接中添加了与候选者相同的 site_id 上的连接,其中适用 vs 硬编码 = 1。此外,对于查询,您应该始终为关注您的人执行 table.column(或别名.column),或者需要澄清不了解您的表的人。我暗示“attachment_id”来自您的附件表(别名为“a”)

Table                  Index
Candidate             ( site_id,email1,candidate_id )
Attachment            ( data_item_id,data_item_type,attachment_id )
candidate_jobOrder    ( candidate_id,site_id,status )
saved_list_entry      ( data_item_id,data_item_type )
,
LIMIT 119985,15

查询必须完成所有工作以获取行,然后在提供所需的 15 行之前一一跳过 119985 行

这是否来自 UI 并且有人执行 Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next Next 是 7999 页的足够次数?!

LEFT JOINsle 完全没用;去掉它。 (这会加快一些速度。)

索引:

c:  INDEX(site_id,email1)   -- (in that order)
a:  INDEX(data_item_id,data_item_type)  -- (either order is ok)
cjo:  INDEX(candidate_id,status,candidate_joborder_id)

替换

        IF(cjo.candidate_joborder_id,1,0) AS submitted,(and)
        LEFT JOIN candidate_joborder AS cjo
            ON c.candidate_id = cjo.candidate_id
            AND c.site_id = cjo.site_id
            AND cjo.status >= 400
            AND cjo.status != 650 

    ( SELECT IF(cjo.candidate_joborder_id,0)
         FROM candidate_joborder AS cjo
            ON c.candidate_id = cjo.candidate_id
            AND c.site_id = cjo.site_id
            AND cjo.status >= 400
            AND cjo.status != 650 
    ) AS submitted,(and)
    no LEFT JOIN

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。