【mysql】关于切分查询
2016-06-01 10:35
274 查看
原文地址:http://blog.csdn.net/moxiaomomo/article/details/9337433
对于大查询有时需要‘分而治之’,将大查询切分为小查询: 每个查询功能完全一样,但只完成原来的一小部分,每次查询只返回一小部分结果集。
删除旧的数据就是一个很好地例子。定期清理旧数据时,如果一条sql涉及了大量的数据时,可能会一次性锁住多个表或行,耗费了大量的系统资源,却阻塞了其他很多小的但重要的查询。将一个大得DELETE语句切分为较小的查询时,可以尽量减少影响msql的性能,同时减少mysql复制造成的延迟。
例如,每个月会运行一次的语句,以清理三个月前的数据:
mysql> DELETE FROM messages WHERE dt<DATE_SUB(NOW(), INTERVAL 3 MONTH);
可以用以下的方法来完成这样的任务:
rows_affected = 0
do {
rows_affected = do_query("DELETE FROM messages WHERE dt<DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")
}while rows_affected>0
一次删除一万行数据是个比较高效且对服务器影响较小的做法。同时如果每次删除数据时暂停一会,可以将服务器原本的一次性压力分散到一个较长的时间段中,从而减少删除时锁表锁行的时间。
(参考自《高性能MySQL》)
对于大查询有时需要‘分而治之’,将大查询切分为小查询: 每个查询功能完全一样,但只完成原来的一小部分,每次查询只返回一小部分结果集。
删除旧的数据就是一个很好地例子。定期清理旧数据时,如果一条sql涉及了大量的数据时,可能会一次性锁住多个表或行,耗费了大量的系统资源,却阻塞了其他很多小的但重要的查询。将一个大得DELETE语句切分为较小的查询时,可以尽量减少影响msql的性能,同时减少mysql复制造成的延迟。
例如,每个月会运行一次的语句,以清理三个月前的数据:
mysql> DELETE FROM messages WHERE dt<DATE_SUB(NOW(), INTERVAL 3 MONTH);
可以用以下的方法来完成这样的任务:
rows_affected = 0
do {
rows_affected = do_query("DELETE FROM messages WHERE dt<DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000")
}while rows_affected>0
一次删除一万行数据是个比较高效且对服务器影响较小的做法。同时如果每次删除数据时暂停一会,可以将服务器原本的一次性压力分散到一个较长的时间段中,从而减少删除时锁表锁行的时间。
(参考自《高性能MySQL》)
相关文章推荐
- 【mysql】关联子查询的一种优化
- MySQL语句大全
- yum 方式安装cloudera manager 5.7
- 笔记一:关于在Windows环境下使用cmd向mysql数据库中导入.sql数据表文件
- 树莓派安装mysql 及开通远程访问设置
- MySQL触发器入门
- Mybatis插入MySQL数据库中文乱码
- Mybatis插入MySQL数据库中文乱码
- mac版MySQL修改root密码
- Mac下MySql卸载方法
- 将ipdata.dat 数据集导入 mysql 中并获取sql文件
- MySQL删除数据库的两种方法
- MySql错误代码1045的解决方案(修改密码)
- mysql二进制日志处理事务与非事务性语句的区别
- MySQL插入数据提示主键冲突,msg:Duplicate entry...............
- myeclispe中向mysql中插入中文数据出现??问题解决办法
- MySQL索引原理及查询优化
- 使用JDBC的存储过程
- mysql插入汉字是乱码或者问号的解决方法
- MySQL中REPLACE INTO语句的用法