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的各种坑及自救方案
当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...
随机推荐
- 弹出USB大容量存储设备时出问题的解决方法
我的计算机->管理->系统工具->事件查看器->自定义视图->Kernel-Pnp->详情->进程ID 然后在任务管理器里找到该进程(任务管理器->查看 ...
- springMVC的 Converter转换器 和 Formatter
Converter转换器 spring的Converter是可以将一种类型转换成另一种类型的一个对象, 自定义Converter需要实现Converter接口 日期转换器 import java.te ...
- 最长公共子序列/子串 LCS(模板)
首先区分子序列和子串,序列不要求连续性(连续和不连续都可以),但子串一定是连续的 1.最长公共子序列 1.最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题 2.同时,子问题的解释可以被重 ...
- 帆软FineReport报表使用小技巧
1.IF函数写法: =IF(E3=0 && F3=0 && G3=0,1,0)
- CF1285D Dr. Evil Underscores
挂个链接 Description: 给你 \(n\) 个数 \(a_1,a_2,--,a_n\) ,让你找出一个 \(x\) ,使 \(x\) 分别异或每一个数后得到的 \(n\) 个结果的最大值最小 ...
- Jdk的删除和配置
电脑里很久以前装的jdk7.0,现在升级到jdk8,为了避免冲突先彻底删除再重新安装新的jdk. 卸载: 设置——应用——搜索java(会显示两个)——左键点击——卸载 安装: jdk-8u212-w ...
- mybatis typealias 问题
最近在学mybatis 在一个简单的问题上却花了挺长时间 网上也没发现有类似的案例 故记录一下 在configuration里面 typealias 和 properties 同时用会出错 具体原因 ...
- 「IOI2014」Wall 砖墙
题目描述 给定一个初始元素为 \(0\) 的数列,以及 \(K\) 次操作: 将区间 \([L, R]\) 中的元素对 \(h\) 取 \(max\) 将区间 \([L, R]\) 中的元素对 \(h ...
- alert \ confirm \ prompt
alert() : 会将()中的内容弹出,返回的是()中的内容值,也就是字符串值 confirm :需要用户点击 "确定" 或 "取消" ,若用户点击 ”确定“ ...
- MYSQL--“Row size too large (> 8126)”
将表的引擎改为MyISAM就可以,如下图. 因为新数据库mysql默认的引擎是InnoDB