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的各种坑及自救方案
当企业内部使用的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的工作.有些迁移很简单,有些迁移可能就会很复杂,大家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪 ...
随机推荐
- 全局注册Vue.directive
1.src目录下新建directives文件 export default { install: function(Vue, option) { // 1:el指绑定的dom元素 // 2:bindi ...
- 通过getGeneratedKeys获取记录的主键
Connection con=null; PreparedStatement ps=null; ResultSet rs=null; try { //建立连接 con= JDBCUtils.getCo ...
- mysql 连接数据库时时区报错
1.url: jdbc:mysql://192.168.0.101:3306/testdb?serverTimezone=UTC,在连接字符后面添加时区设置 2.使用navicat或者直接使用mysq ...
- StringBuilder为什么线程不安全(面试必问)
文章转载自:https://juejin.im/post/5d6228046fb9a06add4e37fe 作者:千山qianshan 1.引言 周五去面试又被面试的一个问题问哑巴了 面试官:Stri ...
- spm_hrf
a=spm_hrf(0.72); n1=MOTOR_taskdesign(1,:);cn1=conv(n1,a);plot(cn1); block design hrf
- git 常用命令记录 -- 快捷&备忘
1.安装 略2.git拉取远程分支 git config user.name git config user.email git config --global user.name xxxx git ...
- Centos610安装redis
.tar.gz 解压 cd redis-5.0.4 编译 make PREFIX=/usr/local/redis install 测试 make test 测试执行失败,请安装tcl,具体参考第二步 ...
- Python 之网络编程之socket(3)hashlib模块
hashlib模块 #hashlib 这个模块是一堆加密算法的集合体,哈希算法的加密方式不止一种 httpswww.cmd5.com md5解密 # 应用场景在需要效验功能时使用 用户密码的 ...
- 认识iOS系统架构
关于本文: 文章主要介绍iOS系统架构中的四层结构的内容.常用的框架.大致的功能,然后对iOS开发人员的发展提出自己的一些拙见. 一.iOS系统是基于UNIX系统,所有从系统稳定性上来说的确比其他操作 ...
- 夯实Java基础(十六)——枚举类的使用
1.枚举类简介 枚举是仅容许特定数据类型值的有限集合.例如我们平时生活中星期一到星期日这七天就是一个特定的有限集合,一年四季的春夏秋冬也同样是的,它们都是枚举.枚举和我们数学中的集合非常相似,如果我们 ...