Cakephp和MySQL拥有庞大的数据

时间:2016-05-09 07:05:28

标签: php mysql sql cakephp

我正在处理呼叫报告模块,其中所有数据都通过呼叫代理的进度自动输入(通过网络服务)。数据通常超过每天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中使用。

0 个答案:

没有答案