突然有一天,运营人员说,push发送数量翻倍了,是什么原因呢。
push发送过多 排查步骤:
系统在给用户发送push的时候,是根据该用户的id,查询出所有登陆过的设备,而发送设备的push的。
sql如下:
SELECT <include refid="Push_User_Columns_PAY"/> FROM push_user WHERE user_id=#userId# AND device_token is not null group by device_token
我们可以设想:如果一个用户修改手机信息,伪造各种设备,该语句返回的记录数量将会是很多的,比如超高1万甚至更多。
线上去查看了下>1000的记录数目
不看不知道,一看吓一跳。
修改sql:
SELECT <include refid="Push_User_Columns_PAY"/> FROM push_user WHERE user_id=#userId# and status=1 and device_token is not null group by device_token order by id desc limit 10
只取前10个,当然大多数是小于10个的,但是得加上limit 10的限制,试想:如果某些用户的记录数>10000,系统内存肯定撑爆,一系列的问题随着而来,full gc,系统变慢,导致不可用。
总结:在写sql的时候,一定要加上limit的限制数量,也许开始数量并不多,但数量一旦多起来的时候,就是系统变慢的时候了,所有这篇文章在此记录下。
相关推荐
在MySQL查询优化中,连接查询(join)与排序(order by)和限制返回结果的数量(limit)是常见的操作,但当它们结合在一起时,可能会导致性能下降。这个问题在标题和描述中已经阐述得很清楚,主要涉及到如何高效地...
在SQL中,这通常涉及对查询结果进行限制,只返回特定范围内的记录。 有多种方法可以实现SQL分页,其中包括使用EJB的Find方法、将所有记录一次性加载到内存中、每次查询一页数据、缓存部分结果以及各种缓存机制。...
`ORDER BY`用于按特定列排序结果,`GROUP BY`用于根据一个或多个列对结果进行分组,`LIMIT`和`OFFSET`用于限制返回的结果数量和起始位置。 事务处理是SQL的另一个重要特性,它确保数据的一致性和完整性。`BEGIN`, `...
使用`ORDER BY`对工龄进行降序排序,然后用`LIMIT`限制结果数量为10。 3. 查询信息学院教授的平均年龄: 结合`DEPARTMENTS`和`EMPLOYEES`表,通过`AVG()`计算平均年龄,并使用`WHERE`子句指定部门和职称。 4. ...
如果有符合条件的数据,那么使用 limit() 方法来限制查询结果集的数量,这样可以实现分页功能,并且使用 select() 方法来获取最终的查询结果集。 文章还提到了一个细节问题,即在应用查询条件时,可能因为错误的...
- 在查询时使用`LIMIT`来分页获取结果,减少数据传输量。 #### 四、优化之SQL数据库 1. **系统调优参数** - `back_log`:用于设置当连接数达到最大值时,还可以有多少个连接请求被放入队列等待。可以根据实际...
`LIMIT`子句用于限制返回的结果数量。这里的`?`占位符通常会在实际执行时被具体的数值替换。例如,如果要查询第一页的数据,每页显示10条记录,那么第一个`?`可能会被替换为`10`(即每页显示的记录数),第二个`?`会...
- 第二层子查询 `SELECT ROWNUM r, * FROM (...) WHERE ROWNUM 给每一行加上行号 `r` 并过滤出前 20 行。 - 最后一层查询 `SELECT * FROM (...) WHERE r > 10` 选取行号 `r` 大于 10 的记录,即第 11 到 20 条记录...
LIMIT语句用于限制查询结果的数量。例如: ```sql SELECT * FROM 表名 LIMIT 0, 3 ``` 这条语句将查询表名的前 3 条数据。 二、添加语法 添加语法用于将数据插入到数据库中。基本结构为: ```sql INSERT INTO 表名...
它会计算起始记录的位置(`start = (currentPage - 1) * pageSize`),然后调整SQL查询语句,加上限制条件。 5. HTML页面展示:在HTML中,创建链接或者按钮,分别指向上一页、下一页以及具体的页码。点击时,通过...
使用LIMIT限制查询结果数量 ```sql SELECT * FROM emp ORDER BY emp_sal DESC LIMIT 2; ``` 按照薪资降序排列,只显示前两条记录。 #### 14. 查询特定范围内的记录 ```sql SELECT * FROM emp ORDER BY emp_sal ...
1. **LIMIT限定查询结果**:使用`LIMIT`来限制返回的行数。 2. **避免SELECT ***:指定需要查询的具体字段。 3. **使用JOIN代替子查询**:通过JOIN来合并多个表的数据,而不是使用子查询。 4. **拆分大型的DELETE或...
2. 查询不同品牌的商品数量:`SELECT brand_id, COUNT(*) FROM Esc_goods GROUP BY brand_id` 3. 查询商品ID为111的对应商品名和分类:`SELECT goods_name, cat_id FROM Esc_goods WHERE goods_id = 111` 请注意,...
5. **执行查询操作**:使用SQL语句加上`LIMIT`子句来获取指定范围内的数据。 6. **显示数据**:将查询结果展示给用户,并提供导航链接以便用户翻页。 #### 四、示例代码解析 下面是对给定JSP分页示例代码的详细解析...
- SQL查询语句:选择分数最高的一个记录,应使用LIMIT限制返回结果的数量,正确写法是`SELECT * FROM performance ORDER BY score DESC LIMIT 1` 4. 操作系统: - 死锁是不同进程因无法释放资源并等待对方释放而...
但这条语句并不会限制查询的结果数量,因此并不适合直接用于翻页。 为了实现翻页,需要扩展此查询语句为: ```sql mysql_query("select * from table order by id desc limit $start, $limit"); ``` 这里`$start`...
- **限制结果集大小**:用于限制查询结果的数量。 - 示例:`SELECT * FROM emp LIMIT 3, 10;` 查询第4行至第13行之间的记录(从0开始计数)。 #### 子查询 - **作为WHERE子句的一部分**: - `ANY`:满足至少一个...
7. MySQL分页查询:在SQL中,`LIMIT`关键字用于实现分页效果,限制返回结果的数量。 8. Windows应用程序窗口:缩小窗口并不意味着程序停止运行,只是窗口变为最小化。 9. 继承与对象:如果p是父类对象,c是子类...
如果要对用户所用的登录终端进行限制,可以更新User表中相应用户的Host字段,在进行了以上更改后应重新启动数据库服务,此时登录时可用如下类似命令: mysql -uroot -p; mysql -uroot -pnewpassword; mysql mydb ...