mysql使用的坑
一:
mysql默认是安装记录的物理顺序取数据的,如果不加order by 排序,可能得不到预期的结果。
(1) 获取 两个时间点的 id (很快)
$sql = ‘select id from apply_info where create_time< {$now} limit 1’; (要加 order by id desc)
获得 idNow
$sql = ‘select id from apply_info where create_time>= {$yesterday} limit 1’ (要加 order by id asc)
获得 idYt
(2) 每次取 1000
do{
select user_mobile,user_from from apply_info where id <= {$idNow} limit 1000;
idNow -= 1000;
//toDo
} while (idNow >= idYt)
二:
当使用limit时,explain可能会造成误导
(1)explain估计行数,不考虑limit,可能会对查询估计过多的检查行数
(2)类似于SELECT ... FROM TBL LIMIT N这样的查询因为用不到索引将要报告为慢查询,(如果N不大,实际很快)
配置文件设置min-examined-row-limit=Num of Rows,检查的行数>=这个量的查询才会被报告为慢查询,避免误判
(3)类似于这样的select .. from tb where key_part1= ? order by key_part2 limit n,explain也要估计出过多的检查行数
领导发的
先说我认为好的方法,很希望有觉得不合理的地方直接发QQ群讨论
1、 获取ID范围
获取minId: select id from apply_info where create_time>= {$yesterday} order by create_time,id limit 1
获取maxId: select id from apply_info where create_time< {$today} order by create_time desc,id desc limit 1
2、 循环获取
while(1)
{
$sql = “select id,user_mobile,user_from from apply_info where id >= $minId and id<=$maxId order by id limit 1000”;
$ret = 执行sql
foreach($ret as $row)//处理
{
}
$minId = $row[‘id’];
If(count($ret) < 1000) break;
}
几个容易有问题的地方:
1、 王璐的获取id的方法,其实会扫描大块索引数据块,改进的方法其实是利用了create_time和id是一致的隐含信息
2、 有同学用获取最大和最小id的时候,用的是= 号,但是该秒如果没有数据就会有问题了
3、 limit m,n会导致扫描m+n行的记录,这块的问题大部分同学都发现了
4、 根据create_time的索引每次获取1000行不好嘛?这里涉及到从索引获取到ID后还需要到数据部分去获取其他字段,需要更多的IO,这个和INNODB的聚簇索引结构相关。
mysql使用的坑的更多相关文章
- 服务器安装mysql遇到的坑
服务器安装mysql遇到的坑 一.CentOS7安装MySQL 1.下载:MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mys ...
- Mac安装mysql遇到的坑
使用XMPP前安装了mysql,小白遇到好多坑,不要见怪 mysql官网下载,选择Community中扩展名为dmg的文件 安装完成后要记住密码,重要的事情只说一遍,对了,安装时也没有偏好设置和自启动 ...
- MySQL大小写补坑记
背景:由于项目开始时数据库设计经验不足,数据库名和部分数据表名都含有大写字母.但问题是,Linux上数据库名和表名是区分大小写的,而Windows上是不区分大小写的.结果就是在看本地的数据库的时候,对 ...
- EF6(CodeFirst)+MySql开发脱坑指南
废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...
- MySQL auto_increment的坑
背景: Innodb引擎使用B_tree结构保存表数据,这样就需要一个唯一键表示每一行记录(比如二级索引记录引用). Innodb表定义中处理主键的逻辑是: 1.如果表定义了主键,就使用主键唯一定位一 ...
- 一步到位Linux中安装配置MySQL及补坑
Windows上安装MySQL也就不讲了,基本上一路点击下一步就可完成,现在讲讲Linux上布署Mysql,虽然也有很多网友列出了详细的步骤,可能是因为版本过老的问题导致即使按照上面一步步来也还是出现 ...
- 安装mysql的踩坑之旅
近期的一个项目要求用mysql数据库,正好系统重装了,复习下mysql的安装,哪成想是踩了无数坑啊! 要安装首先自然是火速进官网下个安装包(下载地址https://dev.mysql.com/down ...
- 下载安装mysql的一些坑
在mysql下载安装的过程中会有一些坑,另外navicat连接mysql数据库时也存在一定的坑,总结如下: 1.计算机中丢失某个dll文件 这个问题好解决,下载个文件就搞定了,下载地址:https:/ ...
- VS2015+MySql+EF6采坑经验总结
背景:VS2015+MySql+EF6(DB First) 采坑顺序:按照以前的记忆,操作依次如下: 1,安装 MySQL Connector/NET(不用想,装最新的,8.0.12) 2.安装 My ...
- 从Oracle迁移到MySQL的各种坑及自救方案
当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...
随机推荐
- Struts2高级(插件)笔记一
插件 Struts-plugin.xml 说明: Struts-plugin.xml文件是在tomcat服务器启动的时候加载的 该配置文件在classpath的根目录下 在每一个含有plugin字母的 ...
- JAVA高级编程数据源datasource
原文链接 数据源 通过jdbc连接数据库,多建立几条连接放在数据源里面.可以设置数据源的最大连接数,同时活跃的连接数,最少空闲的连接数,能够同时接收处理的连接数等等. dbcp数据源 需要的jar包: ...
- 最大流EK板子
#include <bits/stdc++.h> using namespace std; ; const int INF=0x7fffffff; typedef long long ll ...
- 2019年5月17日A股暴跌行情思考
2019年5月17日A股暴跌行情思考 原因:特朗普针对华为的禁商令,人民币对美元汇率大跌 盘面:平开,单边下跌,收盘80多股跌停 操作:下午2点加仓,满仓 总结: 本次操作太过激进. 局势不明朗时抄底 ...
- Linux命令:route命令
route显示或修改IP路由表 route -n:显示路由信息,使用数字格式显示,不反解地址到主机名 #route -n Kernel IP routing table Destination Gat ...
- mybatis利用generator自动生成的代码
/** * 排序规则 */ protected String orderByClause; /** * 去重规则 */ protected boolean distinct; /** * where条 ...
- ardrino#串口控制led
void setup() { pinMode(D6, OUTPUT); digitalWrite(D6,HIGH); Serial.begin(); } void loop() { String st ...
- How to recover if NMC cound not connect
Some times we suddently find that the NMC can not login,. You would see the sybase database error if ...
- Tomcat 8 Invalid character found in the request target. The valid characters are defined in RFC 3986
终极解决方案: Invalid character found in the request target. The valid characters are defined in RFC 3986 ...
- 2020年java架构师是什么-java架构师基本要求
Java系统架构师是一个既必须掌控整体又必须洞察部分瓶颈并根据实际的业务流程情景得出解决方法的团队领导型角色.一个架构师得必须充足的创造力,可以各种各样目标要求开展不一样层面的拓展,为目标顾客出示更加 ...