php查询mysql时,报超出内存错误(select count(distinct))时

本文介绍了一种在使用MySQL查询时遇到的超出内存错误,并提供了解决方案。通过调整MySQL配置文件中的key_buffer_size参数,从3096M减少到512M,解决了查询时出现的内存溢出问题。

学时服务器查询教练所带人数时,使用select count(distinct(u_STRNO))时报超出内存错误。后参考“mysqld-nt: Out of memory解决方法”http://jingyan.baidu.com/article/020278116b428d1bcd9ce568.html?qq-pf-to=pcqq.c2c

修改参数:

key_buffer            = 512K    #global buffer   => key_buffer            = 200M    #global buffer

key_buffer_size = 3096M =>key_buffer_size = 512M

核心提示:检查mysqld配置my.conf,着重看key_buffer_size, max_heap_table_size, tmp_table_size几个参数,

推荐设置key_buffer_size值为max_heap_table_size的1/4.

修改完两个参数后,重启APACHE,问题解决。

转载于:https://www.cnblogs.com/xihong2014/p/5809751.html

<think>好的,我现在需要帮助用户解决关于SQL中SELECT COUNT(DISTINCT)的用法问题。首先,用户的问题是想获取去重后的记录数,所以核心是正确使用COUNTDISTINCT的组合。 我需要先回忆一下基本的SQL语法。COUNT函数通常用来统计行数,而DISTINCT用于去除重复值。结合这两个关键字,应该是COUNT(DISTINCT column),这样可以统计某一列中不同值的数。用户提到的引用[1]中有一个例子,使用SELECT COUNT(DISTINCT 城市) FROM 客户信息.地址,这应该就是正确的用法,可以引用这个例子来说明。 接下来,用户可能需要注意的地方是,DISTINCT的位置是否正确。比如,是否应该放在COUNT里面还是外面。根据引用[2],DISTINCTSELECT语句中会影响所有选择的列,但在这个情况下,COUNT(DISTINCT column)是统计该列的唯一值数,而不是整个行的去重。这里需要明确语法结构,避免用户混淆。 另外,用户可能想知道能否同获取去重后的具体值和数。比如,引用[2]提到,如果想同显示其他字段,直接用DISTINCT可能不行,这候可能需要子查询或者GROUP BY。例如,先选出DISTINCT的城市,再统计数,或者使用GROUP BY来分组统计。不过用户当前的问题只是记录数,所以重点应放在COUNT(DISTINCT)上。 还要注意不同数据库的兼容性,比如在Oracle、MySQL或SQL Server中的写法是否一致。根据引用[3]中的例子,分页查询使用了TOP,可能是SQL Server的语法,但COUNT(DISTINCT)通常是通用的,不过需要确认用户使用数据库类型是否有特殊要求。 用户可能存在的误区包括:误将DISTINCT放在COUNT外面,或者试图在同一个查询中同获取去重后的值和总数。这候需要举例说明正确和错误的写法,帮助用户理解。 最后,根据用户提供的引用,特别是引用[1]中的正确示例,需要强调COUNT(DISTINCT column)的正确结构,并提醒注意字段和名的正确引用,比如是否包含数据库名或架构名,如客户信息.地址这样的写法。 总结下来,回答需要包括基本语法、正确示例、常见错误、扩展用法(如多列统计)以及注意事项,确保用户能够正确应用COUNT(DISTINCT)来实现去重记录数的统计。</think>### SQL中COUNT(DISTINCT)用法详解 **1. 基本语法** ```sql SELECT COUNT(DISTINCT 字段名) FROM 名 ``` 统计指定字段的唯一值数,自动过滤重复值和NULL值[^1]。 **2. 正确示例** ```sql -- 统计地址中不同城市数 SELECT COUNT(DISTINCT 城市) FROM 客户信息.地址 -- [^1] ``` **3. 常见错误** ```sql /* 错误写法:DISTINCT位置错误 */ SELECT DISTINCT COUNT(城市) FROM -- 这实际统计所有非空值数 ``` **4. 扩展用法** ```sql -- 统计多列组合的唯一性(不同数据库语法有差异) SELECT COUNT(*) FROM ( SELECT DISTINCT 城市, 省份 FROM 地址 ) tmp ``` **5. 注意事项** - 字段类型限制:BLOB/TEXT类型字段在某些数据库不支持DISTINCT - NULL处理:COUNT(DISTINCT)会自动忽略NULL值 - 性能优化:大数据建议先创建索引 - 多字段统计:需使用查询或GROUP BY组合[^2] **应用场景示例** ```sql -- 统计不同司机的排班记录(引用[3]场景扩展) SELECT COUNT(DISTINCT assistantDriverGh) FROM tb_driver WHERE department = '谢桥' AND post = '副司机' ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值