当前位置: 首页 > 面试题库 >

MySQL:按块检索较大的选择

何涵衍
2023-03-14
问题内容

我选择了更多

7000万行

我想将所选数据保存到win2012 R2上的一个大型csv文件中

问:如何通过改进从MySQL检索数据以获得更好的性能?

因为当我尝试保存一个大选择时,我得到了

内存不足错误


问题答案:

您可以尝试使用该LIMIT功能。如果您这样做:

SELECT * FROM MyTable ORDER BY whatever LIMIT 0,1000

您将获得前1,000行。第一个LIMIT值(0)定义结果集中的起始行。它的索引为零,因此0表示“第一行”。第二个LIMIT值是要检索的最大行数。要获得接下来的几套1,000,请执行以下操作:

SELECT * FROM MyTable ORDER BY whatever LIMIT 1000,1000 -- rows 1,001 - 2,000
SELECT * FROM MyTable ORDER BY whatever LIMIT 2000,1000 -- rows 2,001 - 3,000

等等。当SELECT没有返回任何行时,您就完成了。

但是,仅凭这还不够,因为在您一次处理1K行时对表所做的任何更改都将使订单无效。要及时冻结结果,请先将结果查询到临时表中:

CREATE TEMPORARY TABLE MyChunkedResult AS (
  SELECT *
  FROM MyTable
  ORDER BY whatever
);

附带说明:最好事先确保临时表不存在:

DROP TEMPORARY TABLE IF EXISTS MyChunkedResult;

无论如何,一旦临时表就位,从那里拉出行块:

SELECT * FROM MyChunkedResult LIMIT 0, 1000;
SELECT * FROM MyChunkedResult LIMIT 1000,1000;
SELECT * FROM MyChunkedResult LIMIT 2000,1000;
.. and so on.

我将留给您创建逻辑,该逻辑将在每个块之后计算极限值并检查结果的结尾。我还建议使用比1000条记录大得多的数据块;这只是我空想的数字。

最后,这是在完成后删除临时表的好形式:

DROP TEMPORARY TABLE MyChunkedResult;


 类似资料:
  • 问题内容: 我在其他帖子上也看到了类似问题的解决方案,但是在将其应用于我的特定问题时遇到了问题。 这是我最初的加入: 结果是: 但是对于每个service_note_task,我实际上只需要一行代表具有最高comment_id的注释,如下所示: 我认为我可以在子选择语句中使用MAX来缩小结果的范围。如何将其合并到语句中以获得这些结果? 问题答案: 作为参考,这被称为“ groupwise-maxi

  • 问题内容: 使用JDBC时,我经常遇到类似 我问自己(也包括代码作者)为什么不使用标签来检索列值: 我听到的最好的解释是关于性能的。但是实际上,这使处理速度非常快吗?我不相信,尽管我从未进行过测量。我认为,即使按标签检索会稍慢一些,但它仍具有更好的可读性和灵活性。 因此,有人可以给我很好的解释,避免使用列索引而不是列标签来检索列值吗?两种方法的优缺点(也许涉及某些DBMS)是什么? 问题答案: 默

  • 问题内容: 我需要查询一个表并选择4列的值中的3个。我需要比较第三列和第四列的值,然后选择较大的值。 例如: 我需要退货: 我一直在尝试使用IF / ELSE,但是我似乎无法正确使用语法 问题答案: 在T-SQL中, IF 命令用于程序控制。例如: 在SQL语句中,您需要 CASE 。

  • 我目前正在重构一个用Symfony 3编写的应用程序,并且严重依赖ORM,我一直在尝试获取一个包含所选列索引的对象/数组。 现在我对PHP PDO相当熟悉,我记得查询结果的基本获取如下所示 (根据我的查询)它会给我一个类似于下面的数组 在理论方面,我尝试使用几个具有水合参数的内置函数 运气不好,我最后得到了这样的东西 有人能帮我或者给我指出正确的方向吗?如何正确地解决这个问题? ----更新了问题

  • 本文向大家介绍MySQL 按列名选择,包括了MySQL 按列名选择的使用技巧和注意事项,需要的朋友参考一下 示例 询问 结果            

  • 问题内容: 我有一个mysql数据库,正试图从我们的网站主机(godaddy)中检索。我遵循的格式似乎正确,但它告诉我: 码: 我做了conn的print语句,以为连接可能为空,并显示为: 任何人都有什么想法会导致这样的事情? 问题答案: 您的数据库URL应包含您的数据库名称。这通常是您的URL,后跟“ / DBNAME”。 其中“ mydb”是您的数据库名称。