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

查询优化

时间:2011-10-21

来源:互联网

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

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



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

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

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

无条件遍历?那没什么可优化得 总得全表扫描

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

引用楼主 test20111016 的回复:
现有一张表customer,其中数据有1百万条,现在要对它进行查询遍历,
PHP code

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


表结构是这样
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 ;


sql语句这样
SQL code

SELECT * from bd_customer WHERE delete_status = 0


目的是怎么让这个查询变的更快些。

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

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

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

引用 4 楼 wwwwa 的回复:

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

不行啊,重复值太多啊,只有两种0和1

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

只有两种,索引的作用不是明显,不过有总比没有强,建立索引试试
OR
考虑分表、分区

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

引用 6 楼 wwwwa 的回复:

只有两种,索引的作用不是明显,不过有总比没有强,建立索引试试
OR
考虑分表、分区

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

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

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

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

引用 8 楼 wwwwa 的回复:

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

还需要建哪个索引?

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

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

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

引用 10 楼 wwwwa 的回复:

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

重复值太多的列,不是不适合建立索引吗?

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

引用 11 楼 test20111016 的回复:
引用 10 楼 wwwwa 的回复:

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

重复值太多的列,不是不适合建立索引吗?

对,参考8楼的 建议

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

引用 12 楼 wwwwa 的回复:

引用 11 楼 test20111016 的回复:
引用 10 楼 wwwwa 的回复:

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

重复值太多的列,不是不适合建立索引吗?

对,参考8楼的 建议


分表:将0、1分开存储(2个表), 这个是什么意思啊?

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

引用 13 楼 test20111016 的回复:
引用 12 楼 wwwwa 的回复:

引用 11 楼 test20111016 的回复:
引用 10 楼 wwwwa 的回复:

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

重复值太多的列,不是不适合建立索引吗?

对,参考8楼的 建议


分表:将0、1分开存储(2个表), 这个是什么意思啊?

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

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

如果只delete_status上只有两种值,则索引没什么作用。不适合创建索引。

可以考虑分区表,但逻辑上会混乱,因为你的delete_status这个字段会加入主键,大部分应用情况下不会因为分区而去改变主键的设计。

另外 SELECT * from bd_customer WHERE delete_status = 0 ,满足这个条件的记录数是多少?

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

引用 15 楼 acmain_chm 的回复:

如果只delete_status上只有两种值,则索引没什么作用。不适合创建索引。

可以考虑分区表,但逻辑上会混乱,因为你的delete_status这个字段会加入主键,大部分应用情况下不会因为分区而去改变主键的设计。

另外 SELECT * from bd_customer WHERE delete_status = 0 ,满足这个条件的记录数是多少?


80多万条

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

引用80多万条
那表中总记录数是多少?

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

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

引用 17 楼 acmain_chm 的回复:

引用80多万条 那表中总记录数是多少?

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

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

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

分区或者分表。

分区不需要动程序,分表需要改程序。

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

100多万条中 80 万符合条件。 则没什么可优化的了。

SQL慢,则看看MYSQL本身的运行参数和硬件。
程序遍历的代码慢的话,要分析是哪几段程序慢了。未必都是MYSQL的问题。

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

你遍历记录集目的是什么

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

引用 21 楼 wwwwa 的回复:

你遍历记录集目的是什么


将这些记录,写入缓存中

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

循环80万条记录,肯定速度慢,写入缓存中有什么用

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

相关阅读 更多

热门下载

更多