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

嗯,犯了一个很低级的错误,最近暴露出来了。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

7bd6d46bacf60d084cac4eb8fe15d9da.png

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

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

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

ea50a39711513582dabc25606b33f66c.png

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

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

e378385d374ea8edd564f1e493d04947.png

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

479c169ec84e5796ee846f2ec902d328.png

f6270c018f18ca81f3caddd749eeddaf.png

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

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

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

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

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

fb94bd038ff4bab03aa36596d1aae24c.png

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)

c89f15bdfcc9643344db7482b7842fe6.png

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

参考:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL中引入存储引擎意义是_mysql学习九:存储引擎、存储过程和函数的引入

存储引擎&#xff1a;存储引擎是mysql特有的&#xff0c;共有7种&#xff0c;常用的有myisam、memory、innodb查看表的存储引擎&#xff1a;show create table 表名;修改表的存储引擎&#xff1a;alter table 表名 engine存储引擎名称;1.myisam存储引擎&#xff1a;可转换为压缩…

python土味情话_土味情话表情包下载

喵星人土味情话表情包是一款很甜的表情图片&#xff0c;现在的聊天模式三句话离不开表情包&#xff0c;而且小编带来的这款表情包非常的适合情侣日常撩&#xff0c;最新的土味情话&#xff0c;需要的朋友可以前来本站下载。土味情话大全一、“对不起。”“你永远都不要和我说对…

多云互操作性!=云服务聚合

多云定义为一种方法&#xff0c;它将来自多个云供应商的多个云&#xff08;公共云或私有云&#xff09;组合在一起。 但是&#xff0c;这不是来自不同供应商的各种服务的集合&#xff0c;它需要一种强制性的胶合剂–云不可知的方法&#xff0c;并在所有提供商之间实现互操作性。…

如何在Spring中将@RequestParam绑定到对象

您是否在请求映射方法中用RequestParam注释了多个参数&#xff0c;并认为它不可读&#xff1f; 当请求中需要一个或两个输入参数时&#xff0c;注释看起来非常简单&#xff0c;但是当列表变长时&#xff0c;您可能会感到不知所措。 您不能在对象内部使用RequestParam批注&…

webstorm前端调用后端接口_软件测试面试题:怎么去判断一个bug是前端问题还是后端问题...

大家好&#xff0c;在软件测试面试过程中&#xff0c;经常有面试官问到这个问题&#xff0c;那我们应该如何回答才好呢&#xff1f;少废话&#xff0c;直接看答案&#xff1a;答案&#xff1a;在页面上发现bug之后&#xff0c;要想判断这个问题属于后端还是前端&#xff0c;我就…

首次适应算法_CVPR 2020丨?商汤TSD目标检测算法获得Open Images冠军

编者按&#xff1a;此前&#xff0c;在文章《商汤科技57篇论文入选ICCV 2019&#xff0c;13项竞赛夺冠》里&#xff0c;商汤君报道了商汤科技荣获Open Images Object Detection Challenge 2019 冠军。由Google AI主办的Open Images大赛是目前通用物体检测和实例分割两个领域中数…

玩JDK 12的Switch表达式

在博客文章“操作中的JDK语言功能预览&#xff1a;切换表达式 ”中&#xff0c;我讨论了JEP 325 [“切换表达式&#xff08; 预览 &#xff09;”&#xff09;如何作为指定的“ 预览语言功能 ”的早期应用&#xff0c;如JEP 12所述。预览语言和VM功能”]。 JEP 325 适用于JDK 1…

python 验证码_4行Python代码生成图像验证码

点击上方蓝色字体&#xff0c;关注我们最近无意看到网上有人使用Python编写几十行代码生成图像验证码&#xff0c;感觉很是繁琐&#xff0c;这里为各位朋友推荐两种方法&#xff0c;使用4行Python代码即可生成验证码。1captcha库第1步&#xff1a;安装captcha库pip install cap…

python3 多线程_Python3多线程爬虫实例讲解

多线程概述多线程使得程序内部可以分出多个线程来做多件事情&#xff0c;充分利用CPU空闲时间&#xff0c;提升处理效率。python提供了两个模块来实现多线程thread 和threading &#xff0c;thread 有一些缺点&#xff0c;在threading 得到了弥补。并且在Python3中废弃了thread…

java多条件组合查询6_elasticsearch组合多条件查询实现restful api以及java代码实现

elasticsearch组合多条件查询实现restful api以及java代码实现实际开发中&#xff0c;基本都是组合多条件查询。elasticsearch提供bool来实现这种需求&#xff1b;主要参数&#xff1a;must文档 必须 匹配这些条件才能被包含进来。must_not文档 必须不 匹配这些条件才能被包含进…

基于java家教管理系统_基于jsp的家教信息管理-JavaEE实现家教信息管理 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的家教信息管理, 该项目可用各类java课程设计大作业中, 家教信息管理的系统架构分为前后台两部分, 最终实现在线上进行家教信息管理各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家教信息管理相关的实体…

如何从云功能调用外部REST API

在之前的博客文章中&#xff0c;我展示了如何创建您的第一个云功能 &#xff08;以及一个视频 &#xff09;。 您的云函数很可能需要调用外部REST API。 以下教程将向您展示如何创建此类功能&#xff08;非常简单&#xff09;。 登录到IBM Cloud帐户 点击目录 删除标签&…

机器学习分类算法_机器学习分类算法

人们曾在自身的神经元得到启发&#xff0c;将机器学习中给出的特征输入与权重之积作为输出与阈值作比较&#xff0c;得到0或者1的输出。这就是我们感知器的实现原理感知器在实现过程中的步骤如下&#xff1a;①将权值初始化称为一个很小的向量②迭代训练所有样本&#xff1a;计…

apache camel_Apache Camel –从头开始开发应用程序(第1部分/第2部分)

apache camel开始之前 前段时间&#xff0c;我写了一篇关于Spring Integration的教程&#xff0c;以演示如何在受现实发票处理系统启发的示例应用程序中使用Spring Integration。 我对此非常满意&#xff0c;因此我决定向您展示如何使用Apache Camel&#xff08;Spring Integra…

weblogic创建域后启动不了_摩托车淋雨后启动不了什么原因?如何解决?

图文是工作&#xff0c;视频是生活。大家好&#xff0c;我是 骑士分享 欢迎您的关注&#xff01;摩托车淋雨后启动不了什么原因&#xff1f;如何解决&#xff1f;这种现象对于电喷车型来说发生的几率并不大&#xff0c;原因就在于电喷车型的线路防水能力会更强&#xff0c;供油…

前端开始学java_[Java教程]开启前端学习之路

[Java教程]开启前端学习之路0 2014-06-10 17:00:06前言第一次在博客园写博客&#xff0c;写写自己开启前端学习之路。应该是受邢师兄的影响吧&#xff0c;不得不说邢师兄人很好&#xff0c;学习也很认真&#xff0c;师兄的前端也是自学的&#xff0c;但是学的很好&#xff0c;大…

xalan_如何以10倍速加速Apache Xalan的XPath处理器

xalan一段时间以来&#xff0c; Apache Xalan中存在一个令人尴尬的错误&#xff0c;该错误是XALANJ-2540 。 此错误的后果是Xalan每次XPath表达式求值将内部SPI配置文件加载数千次 &#xff0c;可以很容易地进行如下测量&#xff1a; 这个&#xff1a; Element e (Element)do…

vim循环下表复制_Vimrc Init.vim太长了?不存在的

精简配置刚开始接触vim&#xff0c;你会被它各种好看的外观以及实用的插件吸引&#xff0c;各种折腾&#xff0c;不知不觉你的vimrc或者init.vim变得特别长&#xff0c;我之前的init.vim有多长&#xff1f;596行&#xff1f;wtf&#xff1f;每次维护的时候不知道有多麻烦&#…

visual studio odbc数据源设计器_NEW!WinForm界面开发设计时正式支持.NET 5

点击“了解更多”获取DevExpress v20.2完整版下载早在今年7月&#xff0c;官方技术团队宣布对DevExpress控件进行功能增强&#xff0c;使其支持最新的.NET 5 Preview。 但是尽管技术团队一直在努力确保WinForms控件与.NET 5兼容但在Visual Studio中对设计器的支持却是另一回事。…

java 接口的观察者模式_java观察者模式

观察者模式又叫做发布-订阅(Publish/Subscribe)模式。观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自己更新自己。Observer结构图.pngSubj…