如何解决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
解释查询
解决方法
无法确定索引的确切组件。但是,建议如下。表上特定的多列索引应该有助于提高性能。
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 JOIN
到 sle
完全没用;去掉它。 (这会加快一些速度。)
索引:
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 举报,一经查实,本站将立刻删除。