昨天接到一客户反映,数据库报表查询好卡,需要我方支援,我们派工程师前往排查问题,发现客户后台有一个快递管理的功能,里面有一个多条件组合的报表查询功能,于是进行数据库监控跟踪,以下是数据库环境的基本信息:

数据库版本:MYSQL 5.7精简版

操作系统:windows2008

下面是跟踪到的有性能问题的报表SQL:

SELECT

*

FROM

kdinfo

WHERE

1 = 1

AND KDType = '7'

AND From_Sheng LIKE '%黑龙江省%'

AND To_Sheng LIKE '%广东省%'

AND STR_TO_DATE(

CONCAT(Scan_Date, ' ', Scan_Time),

'%Y-%m-%d %H:%i:%s'

) > '2020-03-04 00:00'

AND STR_TO_DATE(

CONCAT(Scan_Date, ' ', Scan_Time),

'%Y-%m-%d %H:%i:%s'

) < '2020-03-04 23:59'

ORDER BY

STR_TO_DATE(

CONCAT(Scan_Date, ' ', Scan_Time),

'%Y-%m-%d %H:%i:%s'

) DESC

LIMIT 0,

10

分析:该SQL就是报表对应的功能,执行时间大概需要8S左右,从这个语句的结构来看,有时间过滤条件,还有limit分页功能,理应不会这么慢,于是查看该表kdinfo的表结构,发现:该表将时间分成两个字段,分别是Scan_Date日期(年月天)和小时Scan_Time(小时分秒),所以才有上面的CONCAT(Scan_Date, ’ ', Scan_Time),这个设计不太合理,增加了数据范式的冗余,并且以上SQL语句加上STR_TO_DATE和CONCAT,无法通过直接字段索引方式进行优化,但迫于客户程序代码无法修改的无奈,我方考虑能否通过MYSQL的函数索引方式,将以上时间代码直接转换成索引。

由于该用户用的数据库版本是MYSQL5.7,该版本是可以支持函数索引的(5.7以下不支持):

建立函数索引需要两步

1.创建虚拟列

alter table kdinfo add column Scan_Time_index datetime GENERATED ALWAYS AS

(STR_TO_DATE(CONCAT(Scan_Date, ' ', Scan_Time),'%Y-%m-%d %H:%i:%s'));

注意:增加虚拟列映射以上SQL的时间转换代码

上面这条语句解释

执行上面这语句后,会在表中增加一个字段也就是Scan_Time_index,这个字段其实是个虚拟的,不用管

kdinfo :表名

Scan_Time_index:列名

datetime:列类型

(STR_TO_DATE(CONCAT(Scan_Date, ’ ‘, Scan_Time),’%Y-%m-%d%H:%i:%s’)):需要加索引的函数

2.添加索引

alter table kdinfo add index index_Scan_Time_idx(Scan_Time_index);

上面语句解释

t_log:表名

index_Scan_Time_idx:索引名称

Scan_Time_index:上面创建的列名

到此函数索引建立完成!重新执行以上报表SQL,执行时间从8S下降到0.1S,前端报表性能提升非常显著,客户很满意!

总结:函数索引虽然能给数据库查询性能带来很大的提升,但这种索引由于维护开销比较大,占用空间也大,建议如果程序可以修改的情况下,还是从根本上去修改表结构和SQL代码比较合理!

mysql5.7优化案例_MYSQL5.7函数索引优化案例【企业数据库实战优化项目】相关推荐

  1. oracle 性别 函数索引优化,oracle优化记录4_改写函数索引列

    周六值班写写接口,刚好有一个需求是从表中获取id,id是主键,业务说明如下 id:当天最大编号,格式"L" ||to_char(sysdate,'yyyymmdd') || XXX ...

  2. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例

    关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...

  3. 千呼万唤始出来,MySQL 8.0索引三剑客之函数索引

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  4. 关于数据库SQL优化

    1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬 ...

  5. 数据库性能优化经验总结

    1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

  6. 超详细:数据库性能优化(一)

    出处: https://www.cnblogs.com/easypass/archive/2010/12/ 08/1900127.html 1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位 ...

  7. .Net+SQL Server企业应用性能优化笔记3——SQL查询语句

    在上一篇文章中我们使用了几种方法来确定瓶颈,找到瓶颈,下面再回顾一下: LoadRunner压力测试+Windows计数器,这种方法主要是找出大概的性能问题是在哪台服务器,主要是哪个资源紧张. ANT ...

  8. 数据库性能优化—全局优化思路

    一.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里? 大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...

  9. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  10. mysql5.6 函数索引_聊聊MySQL中的索引

    关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...

最新文章

  1. 监控系统或者网站服务器的报警及复位,机房监控系统标准和常见故障
  2. Boosting(提升方法)之GBDT
  3. ModuleNotFoundError: No module named ‘torch.utils.serialization‘解决
  4. 安卓用targetSdk来兼容各个版本
  5. php原创程序,[原创]我写的最短的微博程序(PHP)
  6. 基于RK3399 PWM驱动开发
  7. 优秀雇员必备六大关键技能(2)
  8. js实现网页中元素缩放(zoom vs scale)
  9. HTML+CSS实现淘宝首页
  10. Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.
  11. 忘了NOD32密码的解决方法
  12. R语言plot函数参数合集
  13. 如何在计算机管理设置开机密码,电脑怎么设置开机密码 开机密码设置步骤
  14. IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法
  15. C --cp2 类似cat工具的小程序。
  16. stm32cubeIDE STLINK连接SWD接口调试,启动GDB server失败的处理
  17. 设计模式读书笔记汇总
  18. 八道二叉树基础程序面试题
  19. windows编程经典书籍
  20. 密封槽设计标准_密封系统设计规范

热门文章

  1. application context not configured for this file于spring框架使用中的原因
  2. 用 servlet 来创建一个用户登录界面
  3. sqlserver中的循环遍历(普通循环和游标循环)(转载)
  4. Javascript中的Trait与代码重用
  5. 互联网金融并不是传统银行的颠覆者
  6. oracle 自定义比较函数
  7. 漫画:如何实现大整数相乘?
  8. 内存中inode与磁盘中inode
  9. ffmpeg超详细综合教程——摄像头直播
  10. freeswitch 文件包含关系图