Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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_Database Performance_Sqlperformance - Fatal编程技术网

MYSQL中的限制偏移量性能问题

MYSQL中的限制偏移量性能问题,mysql,sql,database-performance,sqlperformance,Mysql,Sql,Database Performance,Sqlperformance,Hellow。我有一个有200万行的movies表。我对MySQL中使用限制偏移量分页的性能有问题。 我想创建一个对电影进行分页的电影信息数据集。每页应有20个项目 我的目标是:在查询上快速分页 结果查询在索引列上有8个或更多筛选器,并且分页应该是特定的,比如说我在 第2页,我想进入第800000页,没有很大的时间延迟 创建电影查询表如下所示: #THIS QUERY RUN FOR SOMETHING BETWEEN 12 and 24 secends SELECT * FROM movie

Hellow。我有一个有200万行的movies表。我对MySQL中使用限制偏移量分页的性能有问题。 我想创建一个对电影进行分页的电影信息数据集。每页应有20个项目

我的目标是:在查询上快速分页 结果查询在索引列上有8个或更多筛选器,并且分页应该是特定的,比如说我在 第2页,我想进入第800000页,没有很大的时间延迟

创建电影查询表如下所示:

#THIS QUERY RUN FOR SOMETHING BETWEEN 12 and 24 secends
 SELECT * FROM movies * FROM movies WHERE
 rotten_rate=78 AND imdb_rate=8.40 AND meta_rate=98 AND
 budget=87 AND title="some text" AND revenue=85785 AND
 popularity=700 AND title='is the same in all rows' LIMIT 20 OFFSET 800000;
好的,现在我使用我在网上看到的两个选项,我想在movies表上使用一些过滤器,我想在每个列上使用过滤器,每个列都有一个性能索引

请注意,MOVIES表中的所有数据都是相同的,因为我希望每个表中的数据都相同 筛选器获取所有表以测试所有多个数据结果的分页 当然,在现实世界的应用程序中可能会有超过100万个 带过滤器

我使用的选项:

带限制偏移的分页 用键导引头分页 备选案文1:

当我在Result上限制偏移量时,我使用如下查询:

#THIS QUERY RUN FOR SOMETHING BETWEEN 12 and 24 secends
 SELECT * FROM movies * FROM movies WHERE
 rotten_rate=78 AND imdb_rate=8.40 AND meta_rate=98 AND
 budget=87 AND title="some text" AND revenue=85785 AND
 popularity=700 AND title='is the same in all rows' LIMIT 20 OFFSET 800000;
我在网上搜索,找到一个更好的解决方案,如下所示

解决方案1:我从以下方面找到:

但当我使用带有过滤器的解决方案1时,它会变得很慢,我不知道为什么

  #THIS QUERY EXECUTE AFTER 8 OR 15 seconds.
  SELECT * FROM (SELECT id FROM movies WHERE
     rotten_rate=78 AND imdb_rate=8.40 AND meta_rate=98 AND
     budget=87 AND title="some text" AND revenue=85785 AND
     popularity=700 AND title='is the same in all rows' LIMIT 20 OFFSET 800000)AS t1
     INNER JOIN movies on t1.id=movies.id
备选案文2:

分页的键导引头方法

我发现,从我应该提到这是点头好在我的情况 因为此方法仅在无限滚动或 下一页和前一页。你不能直接跳到某个特定的位置 页假设你在第1页,你想转到第800000页。然后 这种方法一点也不好,因为您需要上一个主节点 第799999页,但你在第4页

我搜索了很多解决方案,这些解决方案使用特定的 页面从任何页面跳转到任何其他页面。但我刚找到这些 两种方法,有人能帮我吗?我想要任何对我有贡献的人 MySQL社区或开发团队将对此提供帮助,因为我知道 这不仅仅是我的问题。谢谢我所有的朋友


只要查询引擎知道如何向您交付第一页的结果以及返回多少行,许多查询就会快速运行

在您的例子中,您可能正在强制SQL引擎实际翻页数十万个结果行,以获得所需的切片。这不仅需要很长的时间,而且会给SQL server本身带来很大的负担,使其无法快速响应其他请求


我认为您需要从根本上重新考虑您的方法,这样您的SQL结果集就不会如此庞大。您需要找到一种在SQL WHERE子句本身中分页的方法。

当您键入类似的内容时,会给人一种您在大喊大叫的印象,没有人想帮助对他们大喊大叫的人。请编辑你的问题,让它平静一点。。。此外,如果你正在寻找优化,考虑张贴你的问题或。Stackoverflow用于特定的编码问题和解决方案。没有ORDER BY的分页没有任何意义。谢谢@The impaler,但是默认情况下mysql ORDER的id为primarykey@DaniyalMadmolil从没听说过这样的事。你能指出有关它的文件吗?这个问题没有很好的表述。投票结束。
#THIS QUERY EXECUTE FOR LESS THAN 1 seconds.
SELECT * FROM (SELECT id from movies  m LIMIT 20 OFFSET 800000)AS t1 INNER JOIN movies on t1.id=movies.id;
  #THIS QUERY EXECUTE AFTER 8 OR 15 seconds.
  SELECT * FROM (SELECT id FROM movies WHERE
     rotten_rate=78 AND imdb_rate=8.40 AND meta_rate=98 AND
     budget=87 AND title="some text" AND revenue=85785 AND
     popularity=700 AND title='is the same in all rows' LIMIT 20 OFFSET 800000)AS t1
     INNER JOIN movies on t1.id=movies.id