MySQL查询速度慢,按顺序排序

MySQL查询速度慢,按顺序排序,mysql,sql,database,Mysql,Sql,Database,因此,当我按日期添加顺序\u last\u access DESC时,我遇到了一个问题,整个查询的速度会降低到3秒,如果没有大约0.2秒,为什么运行速度会如此之慢,如何更改查询以加快运行速度 在使用的所有表和字段上也有索引 用户:100多万条记录 喜欢:500多万条记录,生产量超过10亿条 一旦投入生产,表的增长速度将非常快 质疑 索引 喜欢-用户id,判断用户-正常-B树 用户-id、性别、出生日期、状态、上次访问日期-正常-BTREE 当我用id而不是date\u last\u access

因此,当我按日期添加顺序\u last\u access DESC时,我遇到了一个问题,整个查询的速度会降低到3秒,如果没有大约0.2秒,为什么运行速度会如此之慢,如何更改查询以加快运行速度

在使用的所有表和字段上也有索引

用户:100多万条记录 喜欢:500多万条记录,生产量超过10亿条

一旦投入生产,表的增长速度将非常快

质疑

索引

喜欢-用户id,判断用户-正常-B树

用户-id、性别、出生日期、状态、上次访问日期-正常-BTREE


当我用id而不是date\u last\u access订购时,它似乎运行得更快,这可能是因为date\u last\u access是datetime格式吗

首先尝试对您的查询进行解释。这将向您显示哪些字段和操作减慢了查询速度。然后尝试使用索引列进行连接,并使用更具体的值筛选结果集。

首先尝试运行查询解释。这将向您显示哪些字段和操作减慢了查询速度。然后尝试使用索引列进行联接,并使用更具体的值筛选结果集。

简化子查询可能是避免额外处理时间计数的更好方法:

(SELECT COUNT(*) FROM likes WHERE likes.judged_user = users.id AND likes.user_id = {UID}) = 0
可以改为

(SELECT 1 FROM likes WHERE likes.judged_user = users.id AND likes.user_id = {UID} limit 1) IS NULL
避免子查询可能是提高查询性能的最佳方法。您可以检查哪些选项更适合您的案例。在这种情况下,需要一个likes.user\u id索引

FROM
    users
LEFT JOIN (
SELECT distinct judged_user FROM likes WHERE likes.user_id = {UID}
) l ON l.judged_user=users.id
WHERE
    `id` != {UID} AND
    `gender` = {GEND} AND
    `date_birth` BETWEEN {DOB_MIN} AND {DOB_MAX} AND
    `status` = 'active' AND
    l.judged_user is NULL

简化子查询可能是避免额外处理时间的更好方法:

(SELECT COUNT(*) FROM likes WHERE likes.judged_user = users.id AND likes.user_id = {UID}) = 0
可以改为

(SELECT 1 FROM likes WHERE likes.judged_user = users.id AND likes.user_id = {UID} limit 1) IS NULL
避免子查询可能是提高查询性能的最佳方法。您可以检查哪些选项更适合您的案例。在这种情况下,需要一个likes.user\u id索引

FROM
    users
LEFT JOIN (
SELECT distinct judged_user FROM likes WHERE likes.user_id = {UID}
) l ON l.judged_user=users.id
WHERE
    `id` != {UID} AND
    `gender` = {GEND} AND
    `date_birth` BETWEEN {DOB_MIN} AND {DOB_MAX} AND
    `status` = 'active' AND
    l.judged_user is NULL
您应将FROM子句表述为:

WHERE `id` <> {UID} AND
      `gender` = {GEND} AND
      `date_birth` BETWEEN {DOB_MIN} AND {DOB_MAX} AND
      `status` = 'active' AND
       NOT EXISTS (SELECT 1 FROM likes l WHERE l.judged_user = users.id AND l.user_id = {UID}) 
HAVING distance <= {DIST}
对于此查询,您可以尝试两个索引:

如用户,用户id 用户名、状态、出生日期、id 您应将FROM子句表述为:

WHERE `id` <> {UID} AND
      `gender` = {GEND} AND
      `date_birth` BETWEEN {DOB_MIN} AND {DOB_MAX} AND
      `status` = 'active' AND
       NOT EXISTS (SELECT 1 FROM likes l WHERE l.judged_user = users.id AND l.user_id = {UID}) 
HAVING distance <= {DIST}
对于此查询,您可以尝试两个索引:

如用户,用户id 用户名、状态、出生日期、id
您是否有关于上次访问日期的索引?在所有使用的表和字段上也有索引:请确切地告诉我们您在用户表上有哪些索引。@尼克-是的,我建议编辑您的问题以包括其他信息。您有关于上次访问日期的索引吗?在所有表和字段上也有索引使用的字段:请确切地告诉我们您在用户表上有哪些索引。@尼克-是的,我建议编辑您的问题以包含其他信息。因此,我将最后一个选项放进去,节省了一点时间,这很好,谢谢。仍然有一个问题,上次访问的日期仍然会大大降低访问速度。我已经用数十亿张唱片快速地完成了这项工作,所以在我不得不再次担心之前,还有很多时间,只是在订购时速度变慢了/不幸的是,id!={UID}将不会有良好的性能。将不使用索引,ORDER BY将扫描所有行,因此您可以尝试仅按此顺序创建“date_birth,status,gender”索引,从高基数到低基数,让引擎执行其余操作尝试删除!=我把最后一个选项放进去了,节省了一点时间,这很好,谢谢。仍然有一个问题,上次访问的日期仍然会大大降低访问速度。我已经用数十亿张唱片快速地完成了这项工作,所以在我不得不再次担心之前,还有很多时间,只是在订购时速度变慢了/不幸的是,id!={UID}将不会有良好的性能。将不使用索引,ORDER BY将扫描所有行,因此您可以尝试仅按此顺序创建“date_birth,status,gender”索引,从高基数到低基数,让引擎执行其余操作尝试删除!=要想看到不同之处,那部分可以在超过10亿条记录的情况下正常工作,问题是当我加上它会减慢速度时的顺序。那部分可以在超过10亿条记录的情况下正常工作,问题是添加时的顺序会减慢速度。请尝试使用左连接代替子查询过滤类表的空或零结果。使用左连接代替子查询过滤类表的空或零结果