现有一张表customer,其中数据有1百万条,现在要对它进行查询遍历,$customer = new Customer();
$customers = $customer->getAll();
foreach($customers as $c) {
   // ...
}

解决方案 »

  1.   

    详细说明要求,表结构是什么,SQL语句是什么,要求达到什么目的,
    在查询字段上建立过索引没有?
      

  2.   


    表结构是这样
    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 ;sql语句这样SELECT * from bd_customer WHERE delete_status = 0目的是怎么让这个查询变的更快些。
      

  3.   

    在delete_status上建立索引
    delete_status有多少种值?
    KEY `Index_3` (`delete_status`)
      

  4.   

    索引要建立
    分表:将0、1分开存储(2个表)
    分区表:
    参考一下MYSQL的HELP
    http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html
      

  5.   

    在delete_status上建立索引
    只有两种值,索引的作用不是明显,不过有总比没有强
      

  6.   

    2个表,1个存放delete_status=0的记录
    1个存放delete_status=1的记录
      

  7.   

    如果只delete_status上只有两种值,则索引没什么作用。不适合创建索引。可以考虑分区表,但逻辑上会混乱,因为你的delete_status这个字段会加入主键,大部分应用情况下不会因为分区而去改变主键的设计。另外 SELECT * from bd_customer WHERE delete_status = 0 ,满足这个条件的记录数是多少?
      

  8.   

     那表中总记录数是多少?另外你需要分析一下,是执行SQL语句慢,还是你的程序中逐记录处理慢。
      

  9.   

    总记录数有100万
    sql语句慢,程序遍历也很慢
      

  10.   

    100多万条中 80 万符合条件。 则没什么可优化的了。SQL慢,则看看MYSQL本身的运行参数和硬件。
    程序遍历的代码慢的话,要分析是哪几段程序慢了。未必都是MYSQL的问题。