mysql - 是来自 mysql 的默认查询已排序

标签 mysql sql

我需要将 100 万条记录从 mysql 导出到 ElasticSearch。我使用了以下 sql 查询:

select * from tlogs limit 1,100000
select * from tlogs limit 100001,100000
select * from tlogs limit 200001,100000
select * from tlogs limit 300001,100000
....

以上查询是否可以,我担心结果是随机的,这会导致导入重复的记录。我知道如果我在限制之前使用排序,那就没问题了。但排序很慢。

最佳答案

除非您指定,否则不保证排序顺序。即使看起来它们有某种顺序,也不能保证在 MySQL 的下一个版本中,或者下次添加行、删除行、更改行或更改索引时不会更改,或者 MySQL 决定重新打包您的数据。

您必须指定排序顺序。您还必须在事务中完成工作,否则其他进程可能会在您运行查询时添加或删除行。我选择主键是因为它可能已经按顺序排列并且已经建立索引。

BEGIN;
select * from tlogs ORDER BY id LIMIT 1,100000
...
COMMIT;
<小时/>

我想指出的是,一次获取几行是一种浪费。 ORDER BYLIMIT 的成本会很高。相反,您应该只查询所有 1,000,000 行并一次获取它们。在 Perl 中这将是...

my $sth = $dbh->prepare("SELECT * FROM tlogs LIMIT 1000000");
$sth->execute;
while( my $row = $sth->fetch ) {
    ... do something with the $row ...
}

这避免了交易、订购和限制的需要。该查询应该几乎立即执行。现在的主要成本是数据库 API 的获取成本。

<小时/>

所有这些只是为您获取 MySQL 决定提供给您的前 1,000,000 行。这似乎不太有用。它可能是最后插入的 1,000,000 行,但这并不能保证。也不能保证最后插入的 1,000,000 行是最新的 1,000,000 条日志条目。

如果您想要最新的 1,000,000 个日志条目,您需要一个 ORDER BY 并且我希望该字段已建立索引。

SELECT * FROM tlogs ORDER BY date desc LIMIT 1000000
<小时/>

最后,您应该查看是否 SELECT INTO OUTFILE可用于导出您的数据。它可能是最有效的。

关于mysql - 是来自 mysql 的默认查询已排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33507708/

相关文章:

mysql - 使用其他唯一约束创建代理键表

javascript - 我如何从 PHP fetch assoc 获取结果

php mysql insert from select 引发错误

php,mysql准备好的语句

c# - 为什么通过 OleDb 在 Access 数据库中调用我的更新查询不起作用?

php - MySQL 认为 '2015123' 与 '02015123' 不同

c# - 命令的执行需要一个开放且可用的连接。连接的当前状态已断开。

sql - 使用 GROUP BY 和 OVER

mysql - 使用 Mysql 使用 Express 的 JSON 输出

mysql - 如何避免左连接表显示重复行?