我在表中有 29900000 条记录,偏移量消耗了太多的查询执行时间
SELECT * FROM table_records LIMIT 50 OFFSET 1999950
this query taking 33.087 sec
我已将偏移量更改为 2000000
SELECT * FROM table_records LIMIT 50 OFFSET 2000000
this query taking 2.030 sec
解释
EXPLAIN SELECT * FROM table_records LIMIT 50 OFFSET 29941250
id | select_type | table | type | possible_keys | key | key_len | ref |rows | Extra
1 | SIMPLE | table_records | index | (NULL) | PRIMARY | 4 | (NULL) |29900771 |
我删除了刚设置为限制的偏移量
SELECT * FROM table_records LIMIT 50
this query taking 0.002 sec
感谢任何建议或想法。
最佳答案
一切都与缓存有关。
简而言之,OFFSET 很糟糕。它必须读取并忽略所有“偏移”行,然后传递“限制”行。
当跳过行时,它必须获取行——如果它们在磁盘上,这需要时间;如果它们缓存在 RAM 中,速度会快得多。 (通常快 10 倍。)
您的情况可能发生了什么:第一个查询发现 RAM 中的行很少(如果有的话),因此它必须找到大部分或全部 1999950 行。
然后您的第二个查询快速扫描了 1999950 行,然后从磁盘中提取了最后 50 行。 (或者可能最后 50 条已经进来了,因为 I/O 的单位是一个记录“ block ”。)
使用 LIMIT 和/或 OFFSET,EXPLAIN 很少提供任何线索——它通常提供一个估计表中的总行数。
您的示例还有另一个问题...您没有ORDER BY。因此,引擎可以随意传送它喜欢的任何行。通常它是可以预见的,但有时你会得到惊喜。
但是,一旦您添加了一个ORDER BY,可能需要一个临时表并甚至在获得第一条记录之前进行排序!也就是说,SELECT ... ORDER BY .. LIMIT 50 可能 和所有其他的一样慢——如果您按对索引等不方便的排序,涉及的。
参见 how OFFSET sucks when paginating web pages .这包括“记住你离开的地方”的解决方法。和 this展示了如何有效地获取接下来的 1000 行,即使 ID 存在间隙。
关于mysql innodb 选择偏移量慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39221328/
状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模
我的Rails应用程序中安装了carrierwave。但是,当用户上传多页pdf时,我只希望应用程序获取文档中的第一页并将其转换为jpeg。这可能吗?用什么命令?这是我的uploader。#encoding:utf-8classImageUploader[200,300]##defscale(width,height)##dosomething#end#Createdifferentversionsofyouruploadedfiles:version:thumbdoprocess:resize_to_fill=>[150,210]process:convert=>:jpgdefful
对于用户模型,我有一个过滤器来检查用户的预订状态,该状态由整数值(0、1或2)表示。UserActiveAdmin索引页上的过滤器是通过以下代码实现的:filter:booking_status,as::select然而,这会导致下拉选项为0、1或2。当管理员用户从下拉列表中选择它们时,我更愿意自己将它们命名为“未完成”、“待定”和“已确认”之类的名称。有没有办法在不改变booking_status在模型中的表示方式的情况下做到这一点? 最佳答案 假设booking_status是模型中的枚举字段,您可以使用:过滤器:booking
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:HowdoIgeneratealistofnuniquerandomnumbersinRuby?我想做的事:Random.rand(0..10).timesdoputsRandom.rand(0..10)end但如果随机数已经显示过,则无法再次显示。如何最轻松地做到这一点?
当你在类中包含方法名冲突的模块时,它会使用类定义的方法。有没有办法选择我想运行的?moduleBdefself.hello"helloB"endendclassAincludeBdefself.hello"helloA"endendA.hello#=>thisprints"helloA",whatifIwant"helloB"? 最佳答案 Ben,当你在Ruby中调用一个方法(比如hello)时,会发生以下情况:如果接收者的特征类有一个名为hello的方法,它将被调用。如果不是:如果接收者的类有一个名为hello的实例方法,它将被调
在尝试解决“网格上的路径”问题时,我编写了代码defpaths(n,k)p=(1..n+k).to_ap.combination(n).to_a.sizeend代码工作正常,例如ifn==8andk==2代码返回45,这是正确的路径数。但是,当使用较大的数字时,代码非常慢,我正在努力想出如何加快这个过程。 最佳答案 与其构建组合数组只是为了计算它,不如编写function定义组合的数量。我敢肯定还有包含此功能和许多其他组合函数的gem。请注意,我使用的是gemDistribution对于Math.factorial方法,但这是另一种
基本上我想选择一个节点(div),其中它的子节点(h1,b,h3)包含指定的文本。Childtext1Childtext2...Childtext3我期待的是/html/div/而不是/html/div/h1我在下面有这个,但不幸的是返回了child,而不是div的xpath。expression="//div[contains(text(),'Childtext1')]"doc.xpath(expression)我期待的是/html/div/而不是/html/div/h1那么有没有一种方法可以简单地使用xpath语法来做到这一点? 最佳答案
Nokogiri中是否有一种方法可以选择所有与选择器不匹配的元素。在jQuery中我会使用::not(*[@class='someclass'])但是下面的代码给我一个xpath语法错误dom=Nokogiri::HTML(@file)dom.css(":not(*[@class='someclass'])") 最佳答案 InCSS3,:not()takesaselectorlikeanyother,所以它会是:dom.css(":not(.someclass)")(未经测试,但选择器是正确的)