gpt4 book ai didi

php - 从 mysql 获取大结果集

转载 作者:行者123 更新时间:2023-11-29 05:23:56 28 4
gpt4 key购买 nike

我有一个包含大约 2000 万行的大表,它每天都在增长,我有一个从该表获取查询的表单。不幸的是,查询返回了数十万行。查询是基于时间的,我需要所有记录根据一些规则按'clid'对它们进行分类。所以我需要所有记录对它们进行一些处理以制作结果表。这是我的 table :

    CREATE TABLE IF NOT EXISTS `cdr` (
`gid` bigint(20) NOT NULL AUTO_INCREMENT,
`prefix` varchar(20) NOT NULL DEFAULT '',
`id` bigint(20) NOT NULL,
`start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`clid` varchar(80) NOT NULL DEFAULT '',
`duration` int(11) NOT NULL DEFAULT '0',
`service` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`gid`),
UNIQUE KEY `id` (`id`,`prefix`),
KEY `start` (`start`),
KEY `clid` (`clid`),
KEY `service` (`service`)
) ENGINE=InnoDB DEFAULT CHARSET=utf-8 ;

这是我的查询:

SELECT * FROM `cdr` 
WHERE
service = 'test' AND
`start` >= '2014-02-09 00:00:00' AND
`start` < '2014-02-10 00:00:00' AND
`duration` >= 10

日期周期可以从 1 小时到 60 天甚至更长不等。(例如:

DATE(start) BETWEEN '2013-02-02 00:00:00' AND '2014-02-03 00:00:00'

)

结果集每天大约有 150,000 行。当我尝试在更长的时间甚至一天内获得结果时,数据库崩溃了。有人知道吗?

最佳答案

我不知道如何防止它崩溃,但我对大表所做的一件事是按日期对它们进行分区。

在这里,我按日期对行进行分区,每月两次。只要您的查询使用分区列,它就只会搜索包含键的分区。它不会进行全表扫描。

CREATE TABLE `identity` (
`Reference` int(9) unsigned NOT NULL AUTO_INCREMENT,
...
`Reg_Date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`Reference`),
KEY `Reg_Date` (`Reg_Date`)
) ENGINE=InnoDB AUTO_INCREMENT=28424336 DEFAULT CHARSET=latin1
PARTITION BY RANGE COLUMNS (Reg_Date) (

PARTITION p20140201 VALUES LESS THAN ('2014-02-01'),
PARTITION p20140214 VALUES LESS THAN ('2014-02-14'),
PARTITION p20140301 VALUES LESS THAN ('2014-03-01'),
PARTITION p20140315 VALUES LESS THAN ('2014-03-15'),
PARTITION p20140715 VALUES LESS THAN (MAXVALUE)

);

基本上,您只需对表进行转储,使用分区创建它,然后将数据导入其中。

关于php - 从 mysql 获取大结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22444291/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com