我正在尝试将我的SELECT
查询转换为SELECT
的更快版本,包括JOIN
,我在网上找到了。{/ p>
这是我的代码:
$stmt->prepare("SELECT * FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10");
转换为:
SELECT l.id, value, LENGTH(stuffing) AS len
FROM (
SELECT id
FROM t_limit
ORDER BY
id
LIMIT 150000, 10
) o
JOIN t_limit l
ON l.id = o.id
ORDER BY
l.id
我找到了代码online(最后一段代码)。它应该在执行OFFSET
和LIMIT
时提高性能。无论如何......这是我试过:
$stmt->prepare("SELECT * FROM (SELECT id FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10) o WHERE person_id = :person_id JOIN books l ON l.id = o.id ORDER BY l.id");
但它似乎不起作用。
任何帮助将不胜感激!
答案 0 :(得分:2)
我在网上找到了代码。在做OFFSET和LIMIT时,它应该有助于提高性能。
你在哪里听到的?您引用的声明似乎非常特定于特定的数据库架构,并不适用于您的情况。算了吧。
目前,您当前使用的SQL语句已经是最佳的。如果效果不佳,您可能需要在books (person_id, id)
上创建索引。
答案 1 :(得分:1)
以下是两篇描述搜寻方法的文章:
https://blog.jooq.org/2013/10/26/faster-sql-paging-with-jooq-using-the-seek-method/
和
https://use-the-index-luke.com/sql/partial-results/fetch-next-page
它看起来更适合你正在做的事情。我仍然冒昧地猜测这是一个索引问题,解释会有所帮助。
答案 2 :(得分:-2)
如果有人想知道,我修好了。我将WHERE
子句放在错误的位置。
这是现在的固定版本:
$stmt->prepare("SELECT * FROM (SELECT id FROM books WHERE person_id = :person_id ORDER BY id DESC LIMIT 5, 10) o JOIN books l ON l.id = o.id WHERE person_id = :person_id ORDER BY l.id");