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