嗯,犯了一个很低级的错误,最近暴露出来了。html

背景:mysql

1. 内部平台,接口间断性无返回,查询日志注意到失败时,接口耗时达到4000+(正常状态:100+ms)git

2. 增长日志打点,在关键步骤插入时间戳,发现单步insert 和 select操做耗时1000ms+github

3. 查看数据库表数据,查询表数据量已积累到400w+,天天新增数据4W+,在字符串上创建了索引(以前埋下的很傻行为,无想法的加了索引,功能实现未考虑性能)算法

解决:sql

1. 考虑了数据的必要性,增长事件按期删除过时数据数据库

1. 查看事件开关并开启

SHOW VARIABLESLIKE 'event_scheduler';set global event_scheduler = on

2. 具体执行须要调用的存储过程,删除数据

DELIMITER//

CREATE PROCEDURE delete_data_n_day_ago(IN n int)BEGIN

delete from test_record where time < date_sub(curdate(), INTERVAL n day) ;END

//DELIMITER ;3. 写事件,调用存储过程CREATEEVENT del_dataON SCHEDULE EVERY 1 DAY

ONCOMPLETION PRESERVE

DO CALL delete_data_n_day_ago (3);

附:事件标准语法segmentfault

CREATE

[DEFINER = { user | CURRENT_USER }]EVENT[IF NOT EXISTS]event_nameONSCHEDULE schedule[ON COMPLETION [NOT]PRESERVE][ENABLE | DISABLE | DISABLE ON SLAVE]

[COMMENT 'string']DO event_body;

schedule:

ATtimestamp [+ INTERVAL interval]...|EVERY interval[STARTS timestamp [+ INTERVAL interval]...][ENDS timestamp [+ INTERVAL interval]...]

interval:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |WEEK| SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |DAY_SECOND| HOUR_MINUTE | HOUR_SECOND |MINUTE_SECOND}

详见:mysql手册:https://dev.mysql.com/doc/refman/5.7/en/create-event.html

注释:

event_name :建立的event名字(惟一肯定的)。ONSCHEDULE:计划任务。

schedule: 决定event的执行时间和频率(注意时间必定要是未来的时间,过去的时间会出错),有两种形式 AT和EVERY。[ON COMPLETION [NOT] PRESERVE]: 可选项,默认是ON COMPLETION NOT PRESERVE 即计划任务执行完毕后自动drop该事件;ONCOMPLETION  PRESERVE则不会drop掉。[COMMENT 'comment']:可选项,comment 用来描述event;至关注释,最大长度64个字节。[ENABLE | DISABLE]:设定event的状态,默认ENABLE:表示系统尝试执行这个事件, DISABLE:关闭该事情,能够用alter修改

DO event_body: 须要执行的sql语句(能够是复合语句)。CREATEEVENT在存储过程当中使用时合法的。---------------------

做者:jesseyoung

来源:CSDN

原文:https://blog.csdn.net/JesseYoung/article/details/35257527版权声明:本文为博主原创文章,转载请附上博文连接!

2. 循环调用 insert单条语句修改成批量性能优化

这一点也是网上不少文章提示的,修改成insert into table(keys) values (values1), (values2)...... ,但可能是实验证实,没有原理,直至找到mysql手册数据结构

实际减小了下面提到的connecting + sending query to server  + inserting indexes

3. 修改索引设置,增长自增字段做为主键

接下来就是作的很蠢的事情了,不知当初出于什么考虑,在URL字段增长了索引,压根没有考虑到性能问题,发现以后感受太对不起老师。。。。

不少文章也提到最佳实践,不要在字符串创建索引,本身没有跑具体数据,借用网文数听说明,好比:https://foio.github.io/mysql-stridx/

问题一:在字符串上建索引为何会慢呢?

1. 关于索引使用数据结构,不一样引擎内部实现存在不一致,手册中涉及索引部分是说使用B- tree(虽然,网文不少是说B+ ) 更正下,B-树实际就是B树,B+树能够理解为一种特殊的B树

2. B+ 和B-的区别在因而否存数据非叶子节点不保存关键字记录的指针,数据均存在叶子节点

3. 数据库索引选择使用B树,而不是红黑树/二叉树之类

磁盘I/O操做耗时比内存久,计算机会预读磁盘,以页为单位读取,选取标准:磁盘I/O操做尽可能少

每一个节点做为一页,查询深度越小,磁盘读取操做越少,二叉树之类每一个节点分为2路,相同数据深度更大,故不选取

4. 每一个节点可分的路数越多,深度越小,读取的IO次数越少,索引字段选取int 和 长字符串大小差别,就致使了在字符串上建索引会慢

insert过程也伴随写索引,复杂度参考B树插入数据

4. 确认其余查询语句,新增索引

explain select * from tableName where columnName=2;

id| select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+------------------------------+------+---------------+------+---------+------+--------+-------------+

| 1 | SIMPLE |tableName | ALL | NULL | NULL | NULL | NULL | 437081 | Using where |

ALTER table tableName ADD INDEX indexName(columnName)

后续:代码写以前,先确认SQL语句,explain确认步骤,尽可能避免all类型 和 filesorting

参考:

mysql 批量加索引_mysql优化:按期删数据 + 批量insert + 字符串加索引为何很傻相关推荐

  1. mysql 索引 insert_mysql优化:定期删数据 + 批量insert + 字符串加索引为什么很傻

    嗯,犯了一个很低级的错误,最近暴露出来了. 背景: 1. 内部平台,接口间断性无返回,查询日志注意到失败时,接口耗时达到4000+(正常状态:100+ms) 2. 增加日志打点,在关键步骤插入时间戳, ...

  2. mysql字段简索引_MySQL优化看这一篇就够了

    本文概要 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 ...

  3. mysql优化varchar索引_MySQL优化--概述以及索引优化分析

    一.MySQL概述 1.1.MySQL文件含义 通过如下命令查看 show variables like '%dir%'; MySQL文件位置及含义 名称 值 备注 basedir /usr/ 安装路 ...

  4. mysql 回表查询优化_MySQL优化:如何避免回表查询?什么是索引覆盖?

    转自:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651962609&idx=1&sn=46e59691257 ...

  5. mysql优化和索引_mysql优化和索引

    表的优化 1.定长与变长分离 如 int,char(4),time核心且常用字段,建成定长,放在一张表: 而varchar,text,blob这种变长字段适合单放一张表,用主键与核心表关联. 2.常用 ...

  6. mysql优化之索引_mysql优化之索引

    概念: 在数据库中除了数据之外,还维护着满足特定查找算法的数据结构.这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引.通常使用B树以及变种B+树 ...

  7. mysql in 命中索引_MySql优化-你的SQL命中索引了吗

    在项目开发中SQL是必不可少的,表索也一样.这些SQL的运行性能不知道吗?有多少是命中了索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下. ...

  8. mysql btree索引_MySQL优化之BTree索引使用规则

    MySQL优化之BTree索引使用规则 从一道题开始分析: 假设某个表有一个联合索引(c1,c2,c3,c4)一下--只能使用该联合索引的c1,c2,c3部分 A where c1=x and c2= ...

  9. mysql分页查询关键_MySQL优化教程之超大分页查询

    背景 基本上只要是做后台开发,都会接触到分页这个需求或者功能吧.基本上大家都是会用MySQL的LIMIT来处理,而且我现在负责的项目也是这样写的.但是一旦数据量起来了,其实LIMIT的效率会极其的低, ...

最新文章

  1. 机器之心 Synced 08月12日 20:59
  2. 密码学-hash散列表
  3. (原创).Net将EF运用于Oralce一 准备工作
  4. jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】
  5. 使用EFI引导从硬盘(U盘)安装Win7的图文教程
  6. vue.js 四(指令和自定义指令)
  7. Operation not permitted - /usr/bin/xcodeproj
  8. kinit无密码登录配置
  9. jQuery EasyUI/TopJUI上传多个附件并可以进行删除操作
  10. 谷歌浏览器下载、安装、配置。(保姆级详细教程。)
  11. Android根据包名获取APP名称
  12. 安卓android usb 转 RS 232 串口 芯片的比较
  13. 高速公路收费站通行能力分析与设计
  14. 深度图像修复的回顾和改进:使用生成对抗网络基于Patch的图像修复
  15. eventhandler java_事件驱动模型的简单Java实现
  16. MySQL数据备份批处理
  17. 鸿蒙系统摄像头,内置鸿蒙系统,华为生态产品海雀智能摄像头Pro体验
  18. 类文件解析003-解析常量池
  19. openEuler 嵌入式构建
  20. 一个 Android MVVM 组件化架构框架

热门文章

  1. Spring Batch中的块处理
  2. JAXB自定义绑定– Java.util.Date / Spring 3序列化
  3. 使用MVC模式制作游戏-教程和简介
  4. 异常(Exception)的学习
  5. 手动 clone 安装 Homebrew
  6. Linux 系统下命令 unrar 的中文版使用说明
  7. 自定义Mybatis框架
  8. c语言命名规则_C语言的基本数据类型及变量
  9. 微型计算机生产工艺,bb肥生产设备制造工艺流程
  10. access无法与wincc链接_wincc和Access连接写如变量