Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql限制偏移速度减慢,偏移量值较大_Mysql_Sql - Fatal编程技术网

Mysql限制偏移速度减慢,偏移量值较大

Mysql限制偏移速度减慢,偏移量值较大,mysql,sql,Mysql,Sql,我的查询耗时80秒、70秒等。我正在使用索引,但不知道哪个索引对我的查询有用。当用户直接传递页码(如页码25005000)时,此查询会变慢 SELECT candidate.candidate_id AS candidateID, candidate.candidate_id AS exportID, candidate.is_hot AS isHot, candidate.date_modified AS dateModifiedSort,

我的查询耗时80秒、70秒等。我正在使用索引,但不知道哪个索引对我的查询有用。当用户直接传递页码(如页码25005000)时,此查询会变慢

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, 1, 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
解释问题

无法确定索引的确切组成部分。然而,我建议如下。表上特定的多列索引应有助于提高性能

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, site_id, data_item_type )
使用较短的表别名和可读性稍微重写查询。还添加了与候选站点相同的站点上的连接(如果适用),而连接中的硬编码=1。此外,对于查询,您应该始终为那些跟随您的人执行table.column(或alias.column),或者对不了解您的表的人进行澄清。我暗示“附件id”来自您的附件表(别名为“a”)

查询必须完成获取行的所有工作,然后逐个跳过119985行,然后再交付所需的15行

这是否来自用户界面,然后有人做了下一步。。。有足够的时间跨过7999页

左连接到
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, site_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 


表被索引了吗?是的,索引被设置了。请看一看延迟行查找的概念:请看:首先跳过119985行,只是为了读取接下来的15行会很慢。@OP有耐心。已经读取了119985行,每次15行。用户界面中有一个输入页码的选项,用户可以输入页码或下一页,用户可以输入8000页,然后在查询中输入此限制和偏移值。使用您的查询,它需要15行(75.948秒)的时间,您可以使用3000次。非常感谢你。你就像一个职业选手。请告诉我您是如何知道哪些列应该是索引的?你能指导我决定哪些列应该在索引中以及需要什么步骤吗?我有另一个查询来计算行数,但它也在变慢。@AshishNishad,用这个问题创建另一篇文章,这个查询,其他人(和我)也可以查看并提供帮助。顺便说一句,这个答案是否为您提供了查询性能方面的显著改进。是的,您的答案是最好的。我无法创建其他帖子,因为stackoveflow不允许我。我被困在计数查询中,花了很长时间time@AshishNishad,不允许发布问题是没有意义的。你有什么错误吗?我知道你需要发布问题标题,它会搜索可能的匹配项,然后允许继续重新发布已回答的问题。但在填写了详细信息/正文后,您仍然可以提交问题。如果有其他问题,可能需要去找主持人。
c:  INDEX(site_id, email1)   -- (in that order)
a:  INDEX(data_item_id, data_item_type)  -- (either order is ok)
cjo:  INDEX(candidate_id, site_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, 1, 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