+ -
当前位置:首页 → 问答吧 → 查询优化

查询优化

时间:2011-10-21

来源:互联网

现有一张表customer,其中数据有1百万条,现在要对它进行查询遍历,
PHP code

$customer = new Customer();
$customers = $customer->getAll();
foreach($customers as $c) {
   // ...
}


这样查询很慢,请问应该怎么优化?

作者: test20111016   发布时间: 2011-10-21

怎么没人啊?

作者: test20111016   发布时间: 2011-10-21

数据有100万 难道你的查询不应该在SQL里执行获取需要的结果吗?
非要得到100万条记录然后来foreach?

作者: PhpNewnew   发布时间: 2011-10-21

你要干嘛 为何全部取出来?

作者: kxn308   发布时间: 2011-10-21

引用 2 楼 phpnewnew 的回复:

数据有100万 难道你的查询不应该在SQL里执行获取需要的结果吗?
非要得到100万条记录然后来foreach?


需求是这样啊,不遍历不行啊

作者: test20111016   发布时间: 2011-10-21

建索引了么?引擎是?

数据持续增长的话有没有做表分区。

作者: ohmygirl   发布时间: 2011-10-21

引用 4 楼 test20111016 的回复:
引用 2 楼 phpnewnew 的回复:

数据有100万 难道你的查询不应该在SQL里执行获取需要的结果吗?
非要得到100万条记录然后来foreach?


需求是这样啊,不遍历不行啊


难道你要在一个页面里面显示100万条数据,给人看还是给鬼看??

作者: xinjian555   发布时间: 2011-10-21

取出全部记录,就没有优化而言了

所谓优化,是指如何快速的取出所需的子集

作者: xuzuning   发布时间: 2011-10-21

引用 6 楼 xinjian555 的回复:

引用 4 楼 test20111016 的回复:
引用 2 楼 phpnewnew 的回复:

数据有100万 难道你的查询不应该在SQL里执行获取需要的结果吗?
非要得到100万条记录然后来foreach?


需求是这样啊,不遍历不行啊


难道你要在一个页面里面显示100万条数据,给人看还是给鬼看??


不是在页面显示,是后台的一个程序要把这些数据写入缓存中

作者: test20111016   发布时间: 2011-10-21

引用 5 楼 ohmygirl 的回复:

建索引了么?引擎是?

数据持续增长的话有没有做表分区。


表结构是这样
SQL code

CREATE TABLE IF NOT EXISTS `bd_customer` (
  `customer_id` int(11) NOT NULL AUTO_INCREMENT,
  `company_id` int(11) DEFAULT '0',
  `customer_name` varchar(180) DEFAULT NULL,
  `enterprise_id` int(11) DEFAULT NULL,
  `customer_type` tinyint(4) NOT NULL DEFAULT '1',
  `gender` tinyint(1) NOT NULL DEFAULT '1',
  `mobile` varchar(13) DEFAULT NULL,
  `telephone` varchar(20) DEFAULT NULL,
  `telephone_ext` varchar(10) DEFAULT NULL,
  `birthday` int(11) DEFAULT NULL,
  `email` varchar(160) DEFAULT NULL,
  `fax` varchar(20) DEFAULT NULL,
  `post_code` varchar(6) DEFAULT NULL,
  `identify_type` tinyint(1) DEFAULT '0',
  `identify_code` varchar(50) DEFAULT NULL,
  `in_time` int(11) NOT NULL,
  `province_id` tinyint(11) NOT NULL,
  `city` varchar(20) NOT NULL,
  `address` varchar(255) DEFAULT NULL,
  `delete_status` tinyint(1) NOT NULL DEFAULT '0',
  `capital_word` varchar(1) DEFAULT NULL,
  `call_id` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `t_cusomter_id` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`customer_id`),
  KEY `Index_1` (`enterprise_id`,`telephone`),
  KEY `Index_2` (`company_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1105537 ;

作者: test20111016   发布时间: 2011-10-21

引用 8 楼 test20111016 的回复:
不是在页面显示,是后台的一个程序要把这些数据写入缓存中

那你就该改变思路:采用内存表

作者: xuzuning   发布时间: 2011-10-21

引用 10 楼 xuzuning 的回复:

引用 8 楼 test20111016 的回复:
不是在页面显示,是后台的一个程序要把这些数据写入缓存中
那你就该改变思路:采用内存表


什么意思啊,能不能详细点

作者: test20111016   发布时间: 2011-10-21

顶...

作者: test20111016   发布时间: 2011-10-21

想知道..

作者: van416521   发布时间: 2011-10-21

顶顶..

作者: cuishaoyuan   发布时间: 2011-10-21

google mysql 内存表
引用 11 楼 test20111016 的回复:

引用 10 楼 xuzuning 的回复:

引用 8 楼 test20111016 的回复:
不是在页面显示,是后台的一个程序要把这些数据写入缓存中
那你就该改变思路:采用内存表


什么意思啊,能不能详细点

作者: PhpNewnew   发布时间: 2011-10-21