{"id":91048,"date":"2020-08-08T01:42:02","date_gmt":"2020-08-07T23:42:02","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy"},"modified":"2020-08-08T01:42:02","modified_gmt":"2020-08-07T23:42:02","slug":"ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy","title":{"rendered":"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Os dias em que voc\u00ea n\u00e3o precisava se preocupar com a otimiza\u00e7\u00e3o do desempenho de bancos de dados j\u00e1 passaram. O tempo n\u00e3o para. Cada novo empres\u00e1rio do setor de tecnologia deseja criar mais um Facebook, buscando coletar todos os dados que pode alcan\u00e7ar. Esses dados s\u00e3o essenciais para os neg\u00f3cios, permitindo um treinamento mais eficaz de modelos que ajudam a lucrar. Nessas condi\u00e7\u00f5es, os programadores precisam criar APIs que permitam trabalhar de forma r\u00e1pida e confi\u00e1vel com grandes volumes de informa\u00e7\u00f5es.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/513766\/\"><img decoding=\"async\" alt=\"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.\" src=\"\/wp-content\/uploads\/2020\/08\/28dc2f07d0afe039356e75a098eefde8.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSe voc\u00ea j\u00e1 est\u00e1 projetando por um tempo as partes de servidor de aplicativos ou bancos de dados, provavelmente voc\u00ea escreveu c\u00f3digo para executar consultas com pagina\u00e7\u00e3o. Por exemplo \u2014 assim:<\/p>\n<pre><code class=\"plaintext\">SELECT * FROM table_name LIMIT 10 OFFSET 40\n<\/code><\/pre>\n<p>\n\u00c9 assim mesmo?<\/p>\n<p>Mas se voc\u00ea tem feito a pagina\u00e7\u00e3o dessa forma, lamento informar que voc\u00ea n\u00e3o estava fazendo isso da maneira mais eficiente.<\/p>\n<p>Voc\u00ea quer contestar isso? <noindex><a rel=\"nofollow\" href=\"https:\/\/mariadb.com\/kb\/en\/pagination-optimization\/\">Voc\u00ea pode<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/use-the-index-luke.com\/sql\/partial-results\/fetch-next-page\">n\u00e3o<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eversql.com\/faster-pagination-in-mysql-why-order-by-with-limit-and-offset-is-slow\/\">gastar<\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/Eweaver\/efficient-pagination-using-mysql\">tempo<\/a><\/noindex>. <noindex><a rel=\"nofollow\" href=\"https:\/\/slack.engineering\/evolving-api-pagination-at-slack-1c1f644f8e12\">Slack<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/engineering.shopify.com\/blogs\/engineering\/pagination-relative-cursors\">Shopify<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/engineering.mixmax.com\/blog\/api-paging-built-the-right-way\/\">Mixmax<\/a><\/noindex> j\u00e1 aplicam as t\u00e9cnicas que quero discutir hoje.<\/p>\n<p>Nomeie pelo menos um desenvolvedor de back-end que nunca usou <code>OFFSET<\/code> e <code>LIMIT<\/code> para executar consultas com pagina\u00e7\u00e3o. Em MVP (Produto M\u00ednimo Vi\u00e1vel) e em projetos que usam pequenos volumes de dados, essa abordagem \u00e9 bastante aplic\u00e1vel. Funciona, por assim dizer.<\/p>\n<p>Mas se voc\u00ea precisa construir sistemas confi\u00e1veis e eficientes do zero, deve se preocupar com a efici\u00eancia da execu\u00e7\u00e3o de consultas aos bancos de dados utilizados nesses sistemas desde o in\u00edcio.<\/p>\n<p>Hoje, falaremos sobre os problemas associados \u00e0s implementa\u00e7\u00f5es amplamente utilizadas (infelizmente) dos mecanismos de execu\u00e7\u00e3o de consultas com pagina\u00e7\u00e3o, e como atingir alta performance ao executar essas consultas.<\/p>\n<h2>O que h\u00e1 de errado com OFFSET e LIMIT?<\/h2>\n<p>\nComo j\u00e1 mencionado, <code>OFFSET<\/code> e <code>LIMIT<\/code> t\u00eam um \u00f3timo desempenho em projetos que n\u00e3o exigem trabalhar com grandes volumes de dados.<\/p>\n<p>O problema surge quando o banco de dados cresce a ponto de n\u00e3o caber mais na mem\u00f3ria do servidor. Mas, ao mesmo tempo, voc\u00ea precisa utilizar consultas com pagina\u00e7\u00e3o para trabalhar com esse banco de dados.<\/p>\n<p>Para que esse problema se manifeste, \u00e9 necess\u00e1rio que surja uma situa\u00e7\u00e3o em que o SGBD recorra a uma opera\u00e7\u00e3o ineficiente de varredura completa da tabela (Full Table Scan) ao executar cada consulta com pagina\u00e7\u00e3o (ao mesmo tempo, podem ocorrer opera\u00e7\u00f5es de inser\u00e7\u00e3o e exclus\u00e3o de dados, e dados obsoletos n\u00e3o nos interessam!).<\/p>\n<p>O que \u00e9 uma \"varredura completa da tabela\" (ou \"exibi\u00e7\u00e3o sequencial da tabela\", Sequential Scan)? Trata-se de uma opera\u00e7\u00e3o na qual o SGBD l\u00ea sequencialmente cada linha da tabela, ou seja, os dados contidos nela, e verifica se atendem a uma condi\u00e7\u00e3o espec\u00edfica. Sabe-se que esse tipo de varredura de tabelas \u00e9 o mais lento. O motivo \u00e9 que, ao realiz\u00e1-la, muitas opera\u00e7\u00f5es de entrada\/sa\u00edda s\u00e3o realizadas, envolvendo o subsistema de disco do servidor. A situa\u00e7\u00e3o \u00e9 agravada pelos atrasos associados ao trabalho com dados armazenados em discos e pelo fato de que a transfer\u00eancia de dados do disco para a mem\u00f3ria \u00e9 uma opera\u00e7\u00e3o que consome muitos recursos.<\/p>\n<p>Por exemplo, voc\u00ea possui registros de 100000000 usu\u00e1rios, e est\u00e1 realizando uma consulta com a estrutura <code>OFFSET 50000000<\/code>. Isso significa que o SGBD ter\u00e1 que carregar todos esses registros (e eles nem nos interessam!), coloc\u00e1-los na mem\u00f3ria e, ap\u00f3s isso, pegar, por exemplo, 20 resultados, conforme informado em <code>LIMIT<\/code>.<\/p>\n<p>Digamos que isso pode ser assim: \"selecionar linhas de 50000 a 50020 de 100000\". Ou seja, para o sistema executar a consulta, ser\u00e1 necess\u00e1rio primeiro carregar 50000 linhas. V\u00ea como h\u00e1 muito trabalho desnecess\u00e1rio a ser feito?<\/p>\n<p>Se voc\u00ea n\u00e3o acredita, d\u00ea uma olhada no exemplo que criei usando as funcionalidades de <noindex><a rel=\"nofollow\" href=\"https:\/\/www.db-fiddle.com\/f\/3JSpBxVgcqL3W2AzfRNCyq\/1\">db-fiddle.com<\/a><\/noindex>.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.\" src=\"\/wp-content\/uploads\/2020\/08\/b83c4e9c63e9bab341a13480be571940.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Exemplo no db-fiddle.com<\/i><\/p>\n<p>L\u00e1, \u00e0 esquerda, no campo <code>Schema SQL<\/code>, h\u00e1 um c\u00f3digo que insere 100000 linhas no banco de dados, e \u00e0 direita, no campo <code>Query SQL<\/code>, est\u00e3o mostradas duas consultas. A primeira, lenta, \u00e9 assim:<\/p>\n<pre><code class=\"plaintext\">SELECT *\nFROM `docs`\nLIMIT 10 OFFSET 85000;\n<\/code><\/pre>\n<p>\nE a segunda, que representa uma solu\u00e7\u00e3o eficiente para a mesma tarefa, \u00e9 assim:<\/p>\n<pre><code class=\"plaintext\">SELECT *\nFROM `docs`\nWHERE id &gt; 85000\nLIMIT 10;\n<\/code><\/pre>\n<p>\nPara executar essas consultas, basta clicar no bot\u00e3o <code>Run<\/code> na parte superior da p\u00e1gina. Fazendo isso, vamos comparar as informa\u00e7\u00f5es sobre o tempo de execu\u00e7\u00e3o das consultas. Descobre-se que a execu\u00e7\u00e3o de uma consulta ineficiente demora, no m\u00ednimo, 30 vezes mais que a execu\u00e7\u00e3o da segunda (de execu\u00e7\u00e3o para execu\u00e7\u00e3o, esse tempo varia; por exemplo, o sistema pode relatar que a execu\u00e7\u00e3o da primeira consulta levou 37 ms, enquanto a da segunda levou 1 ms).<\/p>\n<p>E se houver mais dados, a situa\u00e7\u00e3o ficar\u00e1 ainda pior (para verificar isso, veja meu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/IvoPereira\/Efficient-Pagination-SQL-PoC\">exemplo<\/a><\/noindex> com 10 milh\u00f5es de linhas).<\/p>\n<p>O que acabamos de discutir deve lhe dar uma certa compreens\u00e3o de como, na verdade, as consultas \u00e0s bases de dados s\u00e3o processadas.<\/p>\n<p>Considere que quanto maior o valor <code>OFFSET<\/code> \u2014 mais tempo a consulta levar\u00e1.<\/p>\n<h2>O que deve ser usado em vez da combina\u00e7\u00e3o OFFSET e LIMIT?<\/h2>\n<p>\nEm vez da combina\u00e7\u00e3o <code>OFFSET<\/code> e <code>LIMIT<\/code> deve-se usar uma constru\u00e7\u00e3o organizada de forma a:<\/p>\n<pre><code class=\"plaintext\">SELECT * FROM table_name WHERE id &gt; 10 LIMIT 20\n<\/code><\/pre>\n<p>\nEsta \u00e9 uma execu\u00e7\u00e3o de consulta com pagina\u00e7\u00e3o, baseada em cursor (Cursor based pagination).<\/p>\n<p>Em vez de armazenar localmente os atuais <code>OFFSET<\/code> e <code>LIMIT<\/code> e transmiti-los a cada consulta, deve-se armazenar a \u00faltima chave prim\u00e1ria recebida (normalmente, \u00e9 <code>ID<\/code>) e <code>LIMIT<\/code>, e assim se obt\u00eam consultas semelhantes \u00e0quela acima.<\/p>\n<p>Por qu\u00ea? O fato \u00e9 que, ao especificar explicitamente o identificador da \u00faltima linha lida, voc\u00ea informa ao seu SGBD onde ele deve come\u00e7ar a busca pelos dados necess\u00e1rios. Al\u00e9m disso, a busca, gra\u00e7as ao uso da chave, ser\u00e1 realizada de forma eficiente, e o sistema n\u00e3o precisar\u00e1 se distrair com as linhas fora do intervalo especificado.<\/p>\n<p>Vamos dar uma olhada na seguinte compara\u00e7\u00e3o de desempenho de v\u00e1rias consultas. Aqui est\u00e1 uma consulta ineficiente.<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.\" src=\"\/wp-content\/uploads\/2020\/08\/11010a30f16e6528272c35d1dee41b76.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Consulta lenta<\/i><\/p>\n<p>E aqui est\u00e1 \u2014 a vers\u00e3o otimizada dessa consulta.<\/p>\n<p><img decoding=\"async\" alt=\"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.\" src=\"\/wp-content\/uploads\/2020\/08\/6e96525075a3b6b571ef4990e9594299.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Consulta r\u00e1pida<\/i><\/p>\n<p>Ambas as consultas retornam exatamente o mesmo volume de dados. Mas a execu\u00e7\u00e3o da primeira leva 12,80 segundos, enquanto a da segunda leva 0,01 segundo. Voc\u00ea sente a diferen\u00e7a?<\/p>\n<h2>Problemas potenciais<\/h2>\n<p>\nPara garantir o funcionamento eficaz do m\u00e9todo proposto para a execu\u00e7\u00e3o de consultas, \u00e9 necess\u00e1rio que a tabela tenha uma coluna (ou colunas) contendo \u00edndices exclusivos e sequenciais, como um identificador inteiro. Em alguns casos espec\u00edficos, isso pode determinar o sucesso da aplica\u00e7\u00e3o de tais consultas para aumentar a velocidade de opera\u00e7\u00e3o com o banco de dados.<\/p>\n<p>Naturalmente, ao construir consultas, \u00e9 preciso considerar as caracter\u00edsticas da arquitetura das tabelas e escolher os mecanismos que se destacam nas tabelas existentes. Por exemplo, se for necess\u00e1rio trabalhar em consultas com grandes volumes de dados relacionados, voc\u00ea pode achar interessante <noindex><a rel=\"nofollow\" href=\"http:\/\/mysql.rjweb.org\/doc.php\/lists\">este<\/a><\/noindex> artigo.<\/p>\n<p>Se enfrentamos o problema da falta de uma chave prim\u00e1ria, por exemplo, se tivermos uma tabela com um relacionamento \"muitos-para-muitos\", a abordagem tradicional que prev\u00ea a utiliza\u00e7\u00e3o <code>OFFSET<\/code> e <code>LIMIT<\/code>, certamente se aplicar\u00e1. Mas sua aplica\u00e7\u00e3o pode levar \u00e0 execu\u00e7\u00e3o de consultas potencialmente lentas. Nesses casos, eu recomendaria usar uma chave prim\u00e1ria com incremento autom\u00e1tico, mesmo que seja necess\u00e1ria apenas para organizar a execu\u00e7\u00e3o de consultas com pagina\u00e7\u00e3o.<\/p>\n<p>Se voc\u00ea tem interesse nesse tema \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.sitepoint.com\/mysql-performance-indexes-explain\/\">aqui<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.eversql.com\/mysql-explain-example-explaining-mysql-explain-using-stackoverflow-data\/\">aqui<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/@tmateus\/elasticsearch-this-is-how-you-should-paginate-your-results-5d1c71bfe060\">aqui<\/a><\/noindex> \u2014 aqui est\u00e3o alguns materiais \u00fateis.<\/p>\n<h2>Resultados<\/h2>\n<p>\nA principal conclus\u00e3o que podemos tirar \u00e9 que, independentemente do tamanho dos bancos de dados, \u00e9 sempre necess\u00e1rio analisar a velocidade de execu\u00e7\u00e3o das consultas. Nos dias de hoje, a escalabilidade das solu\u00e7\u00f5es \u00e9 extremamente importante, e se desde o in\u00edcio do trabalho em um sistema tudo for projetado corretamente, isso pode, no futuro, livrar o desenvolvedor de muitos problemas.<\/p>\n<p><b>Como voc\u00ea analisa e otimiza as consultas em bancos de dados?<\/b><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/ruvds.com\/ru-rub?utm_source=habr&amp;utm_medium=perevod&amp;utm_campaign=nouseoffsetlimit\"><img decoding=\"async\" alt=\"N\u00e3o use OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o.\" src=\"\/wp-content\/uploads\/2020\/08\/690e7d19962e65f14992d3c9cf34ce73.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/ruvds\/blog\/513766\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0448\u043b\u0438 \u0442\u0435 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435. \u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0431\u0438\u0437\u043d\u0435\u0441\u043c\u0435\u043d \u0438\u0437 \u0441\u0444\u0435\u0440\u044b \u0432\u044b\u0441\u043e\u043a\u0438\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0445\u043e\u0447\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 Facebook, \u0441\u0442\u0440\u0435\u043c\u044f\u0441\u044c \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0442\u044f\u043d\u0443\u0442\u044c\u0441\u044f. \u042d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u044b \u0431\u0438\u0437\u043d\u0435\u0441\u0443 \u0434\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0437\u0430\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":91049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-91048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u043e\u0448\u043b\u0438 \u0442\u0435 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f OFFSET \u0438 LIMIT \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u043e\u0448\u043b\u0438 \u0442\u0435 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-07T23:42:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Evite usar OFFSET e LIMIT em consultas com pagina\u00e7\u00e3o | ProHoster","description":"Os dias em que n\u00e3o era necess\u00e1rio se preocupar com a otimiza\u00e7\u00e3o do desempenho dos bancos de dados acabaram. O tempo n\u00e3o para.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f OFFSET \u0438 LIMIT \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b | ProHoster","og:description":"\u041f\u0440\u043e\u0448\u043b\u0438 \u0442\u0435 \u0434\u043d\u0438, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u043e\u0431 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412\u0440\u0435\u043c\u044f \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/ne-stoit-polzovatsya-offset-i-limit-v-zaprosah-s-razbieniem-na-straniczy","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-07T23:42:02+00:00","article:modified_time":"2020-08-07T23:42:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"91048","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:35:24","updated":"2026-08-11 12:50:11","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=91048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/91048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/91049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=91048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=91048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=91048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}