一、把某些判断移动到应用层

我们需要在一张表里面删除某种类型的数据,大概的表结构类似这样:

CREATE TABLE t (
id INT,
tp ENUM ("t1", "t2"),
PRIMARY KEY(id)
) ENGINE=INNODB;

假设我们需要删除类型为t2的数据,语句可能是这样delete from t where tp = "t2",这样没啥问题,但我们这张表有5亿数据

delete from t where tp = "t2" limit 1000

使用limit来限制一次删除的个数,,不过这有个很严重的问题,就是越往后,随着t2类型的减少,我们几乎都是全表遍历来删除,所以总的应该是O(n*n)的开销。

于是我让他考虑主键,每次操作的时候,记录当前最大的主键,这样下次就可以从这个主键之后开始删除了,首先

select id from t where id > last_max_select_id and tp = "t2" limit 1000;

delete from t where id in (ids);

虽然我们使用了主键,但是MySQL仍然需要不停的读取数据判断条件,加之t2类型的数据在表里面比较少量,所以为了limit 1000这个条件,MySQL需要持续的进行IO读取操作,结果自然是太慢了。

想清楚了这个,其实就好优化了,我们只需要让条件判断在应用层做,MySQL只查询数据返回,语句就是

select id, tp from t where id > last_max_select_id limit 1000;

得到结果集之后,自行判断需要删除的id,然后delete。

看似我们需要额外处理逻辑,并且网络开销也增大了,但MySQL只是简单的IO读取,性能改善明显。

二、three start index

索引设计的原则

1. 查询谓词都能够通过index进行扫描

2. 排序谓词都能够利用index的有序性

3. index包含了查询所需要的所有字段

最新文章

  1. Android总结之链式调用(方法链)
  2. 使用TypeScript拓展你自己的VS Code!
  3. org.hibernate.QueryException: could not resolve property
  4. Promise 异步(asynchronous )编程
  5. MFC程序实现给对话框加入�背景图片
  6. 图论(2-sat):Priest John's Busiest Day
  7. iOS和hybird移动端性能
  8. RFID介绍及电子标签成本预估
  9. HDU 3785 寻找大富翁
  10. jmeter 接口重放(投票活动)
  11. mysql alter总结
  12. UNIX网络编程(卷1)——学习过程中遇到的新词语
  13. mysql使用存储过程和event定期删除
  14. luogu P3760 [TJOI2017]异或和
  15. 学会查看Linux手册页(man文档)
  16. git如何上传所有的新文件 gitlab如何上传所有的新文件 git本地覆盖服务器 强制本地覆盖服务器
  17. [Swift实际操作]七、常见概念-(1).范围Range、ClosedRange和NSRange的使用实际操作
  18. Implementation:Sunday 字符串匹配
  19. SDWC补题计划
  20. duplicate files during packaging of apk

热门文章

  1. html页面工具-htmlUnit
  2. Java如何从服务器获取文件大小?
  3. Java如何计数字串中的一组词组?
  4. spring quartz1.8.6集群结算服务定时任务与appserver独立分开
  5. es6在项目中的应用
  6. HttpSenderUtil向指定 URL 发送POST方法的请求
  7. UML类图中的几种关系的画法和含义
  8. D - Pagodas
  9. ngxs 状态管理器
  10. python数据类型之字典(二)