我正在处理呼叫报告模块,其中所有数据都通过呼叫代理的进度自动输入(通过网络服务)。数据通常超过每天3000条记录到15000条记录。所以,我对数据渲染的所有查询都运行正常。但是当数据变得很大(数百万条记录)时,每个查询需要花费3到4分钟的时间,而且一段时间内存耗尽。
这是我的表cdr Schema,它基于MyISAM并自动增加id:
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(4) DEFAULT NULL,
`p_gateway` varchar(8) NOT NULL,
`callerid` varchar(15) NOT NULL,
`dialedtime` int(10) NOT NULL,
`date` date NOT NULL,
`start` varchar(15) NOT NULL,
`end` varchar(15) NOT NULL,
`t_name` varchar(10) NOT NULL,
`destnumber` varchar(15) NOT NULL,
`deviceip` varchar(15) NOT NULL,
`status` varchar(15) NOT NULL,
PRIMARY KEY (`id`),
KEY `p_gateway` (`p_gateway`)
ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=159 ;
以及一些数据:
id |user_id | p_gateway | callerid | dialedtime | date | start | end | t_name | destnumber | deviceip | status
158 | 4 | '100' | '100' | 0 | '2016-05-07' | '0' | '0' | '' | '900234598610121' | '' | ''
157 | 4 | '100' | '100' | 0 | '2016-05-07' | '0' | '0' | '' | '00223459610121' | '' | ''
155 | 3 | '1001' | '1001' | 0 | '2016-05-06' | '0' | '0' | 'interncal' | '2342344925027' | '133.168.0.175' | 'CANCEL'
156 | 3 | '1001' | '1001' | 0 | '2016-05-06' | '0' | '0' | 'interncal' | '988558855925027' | '166.168.0.175' | 'CHANUNAVAIL');
这是我的Cdr表型号:
<?php
App::uses('AppModel', 'Model');
class Cdr extends AppModel {
public $useTable = 'cdr';
public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id'
)
);
}
?>
我的控制器端查询:
$this->Cdr->recursive = -1;
$this->Paginator->settings = array(
'conditions' => array(
'Cdr.user_id' => 2,
'Cdr.date >=' => '2016-04-1',
'Cdr.date <=' => '2016-04-30'
),
'limit' => 100,
'order'=> "Cdr.id DESC",
'contain' => array(
'User' => array(
'fields' => array(
'User.username'
)
)
)
);
和查询输出:
SELECT `Cdr`.`id`, `Cdr`.`user_id`, `Cdr`.`p_gateway`,
`Cdr`.`callerid`, `Cdr`.`dialedtime`, `Cdr`.`date`,
`Cdr`.`start`, `Cdr`.`end`, `Cdr`.`t_name`, `Cdr`.`destnumber`,
`Cdr`.`deviceip`, `Cdr`.`status`, `User`.`username`
FROM `vpn1`.`cdr_archives` AS `Cdr`
LEFT JOIN `vpn1`.`users` AS `User` ON (`Cdr`.`user_id` = `User`.`id`)
WHERE `Cdr`.`user_id` = 2 AND `Cdr`.`date` >= '2016-04-1'
AND `Cdr`.`date` <= '2016-04-30'
ORDER BY `Cdr`.`id` DESC LIMIT 100
在少数情况下,我需要通过varchar字段进行查询,有时我需要按日期或时间进行查询。另一方面,查询需要花费大量时间,我使用JQuery Ajax来获取数据。
我还使用了[$this->Model->recursive = -1;][2]
并添加了要查询的特定字段。
我在做[Configure::write('debug', 0);][2]
时,对大数据的影响并不大。
那么,我应该采用什么方法?在我的表格或其他方法索引?
我在Cakephp 2.6.1中使用。