如何将select转换为select join?

ogsagwnx  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(304)

我在试着改变我的想法 SELECT 查询到的更快版本 SELECT 包括 JOIN ,我在网上找到的。
这是我的密码:

$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

我在网上找到了那个代码(最后一段代码)。它应该有助于性能时,做 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");

但它似乎不起作用。
任何帮助都将不胜感激!

jm2pwxwz

jm2pwxwz1#

我在网上找到了那个代码。它应该有助于性能时,做抵消和限制。
你在哪儿听到的?您引用的语句似乎非常特定于特定的数据库模式,不适用于您的情况。算了吧。
从目前的情况来看,您当前使用的sql语句已经是最佳的了。如果它执行得不充分,则可能需要在上创建索引 books (person_id, id) .

j2qf4p5b

j2qf4p5b2#

如果有人想知道,我已经修好了。我把 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");
wdebmtf2

wdebmtf23#

下面有两篇文章介绍seek方法:

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

看起来更适合你的工作。我仍然大胆猜测这是一个索引问题,一个解释会有帮助。

相关问题