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

背景:

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

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

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

解决:

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);

附:事件标准语法

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 索引 insert_mysql优化:定期删数据 + 批量insert + 字符串加索引为什么很傻相关推荐

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

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

  2. distinct性能问题_Mysql性能优化:如何给字符串加索引?

    导读 现代大部分的登录系统都支持邮箱.手机号码登录两种方式,那么如何在邮箱或者手机号码这个字符串上建立索引才能保证性能最佳呢? 今天这篇文章就来探讨一下在Mysql中如何给一个字符串加索引才能达到性能 ...

  3. 11 怎么给字符串加索引

    11 怎么给字符串加索引 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引? 用户表定义 mysql> create table SUser( ID bigint uns ...

  4. 《MySQL——给长字符串加索引》

    对于长字符串,可用如下方式建立索引: (1)前缀索引 (2)字符串倒叙+前缀索引 (3)添加hash字段+并在hash字段上加索引 (4)字段拆分(一个字段可拆分为两个以上) 假设现在表User 中存 ...

  5. 如何给特殊字符串加索引:如身份证、邮箱等

    1 建表语句 CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`id_card` varchar(18) NOT NULL,`ema ...

  6. mysql 改表面_MySQL_解析MySQL数据库性能优化的六大技巧,数据库表表面上存在索引和防 - phpStudy...

    解析MySQL数据库性能优化的六大技巧 数据库表表面上存在索引和防错机制,然而一个简单的查询就会耗费很长时间.Web应用程序或许在开发环境中运行良好,但在产品环境中表现同样糟糕.如果你是个数据库管理员 ...

  7. mysql范围条件_MySQL 索引及优化实战(一)

    mysql 随着系统用户量的不断增加,MySQL 索引的重要性不言而喻,对于后端工程师,只有在了解索引及其优化的规则,并应用于实际工作中后,才能不断的提升系统性能,开发出高性能.高并发和高可用的系统. ...

  8. 【MySQL】索引优化中的最左前缀原则和索引下推

    目录 一.引入 二.覆盖索引 ​ 讲接下来的问题前首先讲一下联合索引的底层存储结构长什么样?联合索引的检索过程是什么样的呢? 三.最左前缀原则 最左前缀原则的定义 四.索引下推 五.小结 一.引入 在 ...

  9. MySQL 高级知识(索引、优化)

    MySQL体系架构 连接池组件.管理服务和工具组件.SQL接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理文件: 1.连接层:主要完成一些类似于连接处理,授权认证及相关的方案: 2 ...

最新文章

  1. AttributeError: h5py.h5.H5PYConfig‘ has no attribute ‘__reduce_cython__‘
  2. ubuntu -- 安装memcached
  3. 【职场】清华同学在鹅厂五星绩效,还是失业了!
  4. 大话设计模式—备忘录模式
  5. 7.python之正则表达式re模块
  6. mysql global index_Oracle中addsplit partition对globallocal index的影响
  7. 创建mysql制定字符集语句_创建数据库指定字符集语句
  8. (79)FPGA面试题-Verilog实现五分频
  9. 从RCNN到SSD,深度学习目标检测算法盘点
  10. java先默认初始化子类吗,Java 对象初始化顺序
  11. 【work】输出日期为那一年的第几天
  12. jquery Map转JSON
  13. idea中svn颜色代表的文件状态
  14. 云展网教程 | 如何更改logo和设置点击logo时的转跳链接?
  15. python+opencv代码给证件照换底色(别再用PS啦)(转载)
  16. html 用css画出斑马线,CSS3实现斑马线、棋盘、格子复杂背景
  17. CTAB-GAN:高效且可行的表格数据合成
  18. 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日行业成交额图
  19. 【光模块单模和多模的区别及使用】
  20. javaScript回调函数

热门文章

  1. 通过了面试,却不会和hr聊薪水?
  2. 真强啊!建议每一个打算学Java的人都来看看!
  3. 全网首次公开!iOS14 到来前,开发者必需的时间表及 To do list
  4. 罗永浩:我今年四十八岁,还可以承受无数次的失败;iOS14 或将推出系统级「小程序」功能;​ PyCharm新版发布| 极客头条...
  5. 日均 61 亿次攻击、挖矿病毒“卫冕”安全威胁之最,云上安全防御如何“战”?...
  6. Java、SQL 十年混战史:Oracle 告 Google、“窃”IBM 往事
  7. iOS 开发面试通关指南:67 个必知问题!
  8. 表弟励志做程序员了,除了霸王我还能给他什么?
  9. 月薪3k和30k的程序员,差距就在这道坎...
  10. 5G 登上“神坛”,区块链裁员求生!