查询优化
时间:2011-10-21
来源:互联网
PHP code
$customer = new Customer(); $customers = $customer->getAll(); foreach($customers as $c) { // ... }
作者: test20111016 发布时间: 2011-10-21
在查询字段上建立过索引没有?
作者: WWWWA 发布时间: 2011-10-21
作者: rucypli 发布时间: 2011-10-21
现有一张表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有多少种值?
KEY `Index_3` (`delete_status`)
作者: WWWWA 发布时间: 2011-10-21
在delete_status上建立索引
delete_status有多少种值?
KEY `Index_3` (`delete_status`)
不行啊,重复值太多啊,只有两种0和1
作者: test20111016 发布时间: 2011-10-21
OR
考虑分表、分区
作者: WWWWA 发布时间: 2011-10-21
只有两种,索引的作用不是明显,不过有总比没有强,建立索引试试
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
索引要建立
分表:将0、1分开存储(2个表)
分区表:
参考一下MYSQL的HELP
http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html
还需要建哪个索引?
作者: test20111016 发布时间: 2011-10-21
只有两种值,索引的作用不是明显,不过有总比没有强
作者: WWWWA 发布时间: 2011-10-21
在delete_status上建立索引
只有两种值,索引的作用不是明显,不过有总比没有强
重复值太多的列,不是不适合建立索引吗?
作者: test20111016 发布时间: 2011-10-21
引用 10 楼 wwwwa 的回复:
在delete_status上建立索引
只有两种值,索引的作用不是明显,不过有总比没有强
重复值太多的列,不是不适合建立索引吗?
对,参考8楼的 建议
作者: WWWWA 发布时间: 2011-10-21
引用 11 楼 test20111016 的回复:
引用 10 楼 wwwwa 的回复:
在delete_status上建立索引
只有两种值,索引的作用不是明显,不过有总比没有强
重复值太多的列,不是不适合建立索引吗?
对,参考8楼的 建议
分表:将0、1分开存储(2个表), 这个是什么意思啊?
作者: test20111016 发布时间: 2011-10-21
引用 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这个字段会加入主键,大部分应用情况下不会因为分区而去改变主键的设计。
另外 SELECT * from bd_customer WHERE delete_status = 0 ,满足这个条件的记录数是多少?
作者: ACMAIN_CHM 发布时间: 2011-10-21
如果只delete_status上只有两种值,则索引没什么作用。不适合创建索引。
可以考虑分区表,但逻辑上会混乱,因为你的delete_status这个字段会加入主键,大部分应用情况下不会因为分区而去改变主键的设计。
另外 SELECT * from bd_customer WHERE delete_status = 0 ,满足这个条件的记录数是多少?
80多万条
作者: test20111016 发布时间: 2011-10-21
另外你需要分析一下,是执行SQL语句慢,还是你的程序中逐记录处理慢。
作者: ACMAIN_CHM 发布时间: 2011-10-21
引用80多万条 那表中总记录数是多少?
另外你需要分析一下,是执行SQL语句慢,还是你的程序中逐记录处理慢。
总记录数有100万
sql语句慢,程序遍历也很慢
作者: test20111016 发布时间: 2011-10-21
分区不需要动程序,分表需要改程序。
作者: zuoxingyu 发布时间: 2011-10-21
SQL慢,则看看MYSQL本身的运行参数和硬件。
程序遍历的代码慢的话,要分析是哪几段程序慢了。未必都是MYSQL的问题。
作者: ACMAIN_CHM 发布时间: 2011-10-21
作者: WWWWA 发布时间: 2011-10-21
你遍历记录集目的是什么
将这些记录,写入缓存中
作者: test20111016 发布时间: 2011-10-21
作者: wwwwb 发布时间: 2011-10-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28