mysql:(pdo)在最后一个位置继续,不使用偏移量

mysql:(pdo)在最后一个位置继续,不使用偏移量,mysql,pdo,Mysql,Pdo,我希望使用PDO检索大约2亿个配置文件。 它是一个分区表,因此它没有主键,而是使用INNODBs内部主键进行排序 为了提高性能,我需要按照内部排序顺序检索数据,因此出于性能原因,使用sort BY some_id并从那里继续将不起作用 使用限制偏移量根本不起作用,偏移量1亿或更多将需要时间,RAM远远不足以将表数据的所有字节放入缓存 我需要一些东西来获取一大块行,记住内部位置并继续下一个调用 更新 我进行了一些挖掘,这个问题似乎很熟悉,在Oracle中通过使用ROWID和ROWNUM解决了这个问

我希望使用PDO检索大约2亿个配置文件。
它是一个分区表,因此它没有主键,而是使用INNODBs内部主键进行排序

为了提高性能,我需要按照内部排序顺序检索数据,因此出于性能原因,使用sort BY some_id并从那里继续将不起作用

使用限制偏移量根本不起作用,偏移量1亿或更多将需要时间,RAM远远不足以将表数据的所有字节放入缓存

我需要一些东西来获取一大块行,记住内部位置并继续下一个调用

更新 我进行了一些挖掘,这个问题似乎很熟悉,在Oracle中通过使用ROWID和ROWNUM解决了这个问题。ROWID和ROWNUM指的是内部id。
我们在innodb中似乎也有这样一个id,但它不是可查询的
这听起来像是mysql在性能查询方面的一个明显缺点

表def:

    CREATE TABLE `members` (
  `id` int(11) NOT NULL DEFAULT 0,
  `intern_id` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `first_name` varchar(48) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `last_name` varchar(48) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `middle_name` varchar(48) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `l` varchar(196) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `i` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `ex` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `country_code` varchar(4) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `country_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `state_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `city_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `edu` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `nc` smallint(6) DEFAULT NULL,
  `nj` smallint(6) DEFAULT NULL,
  `jt` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `cn` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `email_address` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `fpe` tinyint(4) DEFAULT NULL COMMENT '1/0',
  `pbu` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `cii` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `unmatched_facts` varchar(2048) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `dt_snapshot` datetime DEFAULT NULL,
  `change_small` tinyint(4) DEFAULT NULL,
  `change_significant` tinyint(4) DEFAULT NULL,
  `jta` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `cna` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `cnia` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `ut_created` int(11) DEFAULT NULL ,
  `reserve_int_2` int(11) DEFAULT NULL,
  `reserve_vc1` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `reserve_vc2` varchar(128) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `reserve_vc_3` varchar(256) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  KEY `id` (`id`),
  KEY `intern_id` (`intern_id`),
  KEY `state_name` (`state_name`),
  KEY `city_name` (`city_name`),
  KEY `i` (`i`),
  KEY `country_name` (`country_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
  PARTITION BY KEY (`country_name`)
  PARTITIONS 30 

这可能更适合dba论坛
OFFSET 1亿或更多需要花费时间
为什么?你能提供你的模式吗?你在运行什么?你说的PDO是指php PDO?是的,是php PDO。但这可能并不重要。偏移量1亿对于使用偏移量0运行0.5秒的查询,需要时间、半小时或更长时间。Mysql必须先搜索1亿个posion,然后才能检索行。@Solarflare我刚刚得出这个结论;/看起来innodb确实有,只是内部的。这真是糟糕透了,他们支持分区的时间太长了,但是如果没有ROWID,你就无法真正使用它的潜力。不幸的是,MySQL不提供未缓存的服务器端游标,因此如果没有主键,你就无法做到这一点。我不太清楚您所说的“它是一个分区表,所以没有主键”是什么意思。正如Alex所建议的,您可以分享一下您的表定义吗?也许您可以添加/使用一个可行的pk。