mysql5.7优化案例_MYSQL5.7函数索引优化案例【企业数据库实战优化项目】
昨天接到一客户反映,数据库报表查询好卡,需要我方支援,我们派工程师前往排查问题,发现客户后台有一个快递管理的功能,里面有一个多条件组合的报表查询功能,于是进行数据库监控跟踪,以下是数据库环境的基本信息:
数据库版本: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函数索引优化案例【企业数据库实战优化项目】相关推荐
- oracle 性别 函数索引优化,oracle优化记录4_改写函数索引列
周六值班写写接口,刚好有一个需求是从表中获取id,id是主键,业务说明如下 id:当天最大编号,格式"L" ||to_char(sysdate,'yyyymmdd') || XXX ...
- oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例
关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...
- 千呼万唤始出来,MySQL 8.0索引三剑客之函数索引
MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...
- 关于数据库SQL优化
1.数据库访问优化 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬 ...
- 数据库性能优化经验总结
1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...
- 超详细:数据库性能优化(一)
出处: https://www.cnblogs.com/easypass/archive/2010/12/ 08/1900127.html 1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位 ...
- .Net+SQL Server企业应用性能优化笔记3——SQL查询语句
在上一篇文章中我们使用了几种方法来确定瓶颈,找到瓶颈,下面再回顾一下: LoadRunner压力测试+Windows计数器,这种方法主要是找出大概的性能问题是在哪台服务器,主要是哪个资源紧张. ANT ...
- 数据库性能优化—全局优化思路
一.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里? 大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件 ...
- mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...
- mysql5.6 函数索引_聊聊MySQL中的索引
关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...
最新文章
- 监控系统或者网站服务器的报警及复位,机房监控系统标准和常见故障
- Boosting(提升方法)之GBDT
- ModuleNotFoundError: No module named ‘torch.utils.serialization‘解决
- 安卓用targetSdk来兼容各个版本
- php原创程序,[原创]我写的最短的微博程序(PHP)
- 基于RK3399 PWM驱动开发
- 优秀雇员必备六大关键技能(2)
- js实现网页中元素缩放(zoom vs scale)
- HTML+CSS实现淘宝首页
- Windows7不再卡五叶草,更新了bootx64.efi和bootmgfw.efi文件,支持安全启动,不用关闭安全启动和打开csm支持.
- 忘了NOD32密码的解决方法
- R语言plot函数参数合集
- 如何在计算机管理设置开机密码,电脑怎么设置开机密码 开机密码设置步骤
- IEEE论文检测的字体未嵌入问题Times New Roman,Bold, Times New Roman,Italic is not embedded解决方法
- C --cp2 类似cat工具的小程序。
- stm32cubeIDE STLINK连接SWD接口调试,启动GDB server失败的处理
- 设计模式读书笔记汇总
- 八道二叉树基础程序面试题
- windows编程经典书籍
- 密封槽设计标准_密封系统设计规范