我有以下SQL查询,该查询效果很好,但处理速度很慢(3到5秒)。我已经在“ slug”和“ checksum”列上创建了索引,但是由于IN子句遍历了5000至10000行,因此不够快。我读到有一种方法可以使用临时表和/或联接对其进行改进,但是我找不到一种使它起作用的方法。
数据库引擎是MySQL上的InnoDB。任何帮助将非常感激。
SELECT name AS personName,
slug AS personSlug,
COUNT(slug) AS personCount
FROM person
WHERE checksum IN
( SELECT checksum
FROM person
WHERE slug = 'john-doe' )
AND NOT (slug = 'john-doe')
GROUP BY personName
ORDER BY personCount DESC
我没有完全理解您的查询正在尝试执行的操作而没有看到一些示例数据。但是,似乎您正在尝试查找与与“ john-doe”相关联的校验和匹配的所有校验和,但没有slug =“ john-doe”-因此搜索某种重复项。
以下自我加入应该为您做到这一点。
SELECT
p.name AS personName,
p.slug AS personSlug,
COUNT(p.slug) AS personCount
FROM
person AS p
INNER JOIN
person AS p2
ON
p.checksum = p2.checksum
WHERE
p2.slug = 'john-doe'
AND p.slug <> 'john-doe'
GROUP BY personName
ORDER BY personCount DESC
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句