深圳英文网站制作,建设网站北京,网站建设客户会问的问题,网站建设需求方案文档嗯#xff0c;犯了一个很低级的错误#xff0c;最近暴露出来了。html背景#xff1a;mysql1. 内部平台#xff0c;接口间断性无返回#xff0c;查询日志注意到失败时#xff0c;接口耗时达到4000(正常状态#xff1a;100ms)git2. 增长日志打点#xff0c;在关键步骤插入…嗯犯了一个很低级的错误最近暴露出来了。html背景mysql1. 内部平台接口间断性无返回查询日志注意到失败时接口耗时达到4000(正常状态100ms)git2. 增长日志打点在关键步骤插入时间戳发现单步insert 和 select操做耗时1000msgithub3. 查看数据库表数据查询表数据量已积累到400w天天新增数据4W在字符串上创建了索引(以前埋下的很傻行为无想法的加了索引功能实现未考虑性能)算法解决sql1. 考虑了数据的必要性增长事件按期删除过时数据数据库1. 查看事件开关并开启SHOW VARIABLESLIKE event_scheduler;set global event_scheduler on2. 具体执行须要调用的存储过程删除数据DELIMITER//CREATE PROCEDURE delete_data_n_day_ago(IN n int)BEGINdelete from test_record where time date_sub(curdate(), INTERVAL n day) ;END//DELIMITER ;3. 写事件调用存储过程CREATEEVENT del_dataON SCHEDULE EVERY 1 DAYONCOMPLETION PRESERVEDO CALL delete_data_n_day_ago (3);附事件标准语法segmentfaultCREATE[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 indexes3. 修改索引设置增长自增字段做为主键接下来就是作的很蠢的事情了不知当初出于什么考虑在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 columnName2;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参考