SQL调优是一项很重要的技术,实际在使用小数据集时DBMS自身的搜索优化是能满足我们的时间需求的,只有在数据集规模到10w+以后才能在秒级的层面看到SQL代码优化的效果。
本次实验环境如下:
操作系统:Mac OS X 10.13
DBMS:MySQL 8.0
图形化管理界面:MySQL Workbench
表结构
本次实验选用了一个待测试表,名为‘pv_train_part1’,其结构如下:
名称 | 类型 | 实例 |
---|---|---|
Key | int | 5 |
Feature1 | double | 1.294408418 |
Feature2 | double | 1.331507473 |
Feature3 | double | 1.279030084 |
Feature4 | double | 0.545543622 |
Feature5 | int | 64125 |
Feature6 | double | 1.738819447 |
Feature7 | double | 0.88708635 |
Feature8 | double | 28622.91442 |
label | int | 0 |
数据仿真方法
此数据集来源于我跟随老师做的项目,从数据实例和分布来看其明显是一个机器学习模型的训练数据样本,大体是一个八参数的分类问题(实则是一个多参数的特征选取和异常数据监测项目)。
本数据取自github上的开源数据集,其链接为:
数据集
数据记录数
通过MySQL Workbench的‘Table Data Import Wizard’功能,可以实现将外部csv文件导入的功能:
通过执行结果可以观测到数据记录数如下:
优化规则及执行时间
优化规则一:建立索引
首先我使用的第一条优化规则便是建立索引,这在几乎所有的DBMS上是通用的优化策略。为了便于展示,这里的优化执行结果以执行查询操作来作为反馈。
在没建立索引前,表的设计层面如下:
执行查询语句:1
select feature3 from pv_train_part1 where pv_train_part1.key=59081;
结果如下:
可以看到该查询的执行时间为: 0.056 second 。
然后我们给key属性添加主键索引,添加完之后设计层面如下:
添加完成之后重新执行相同的查询语句,执行时间如下:
可以看到,在添加完主键索引之后,查询时间变成了 0.00034 second,较未添加索引之间查询效率提高了 163 倍。
优化规则二:查询限制
在MySQL中,假如只需要一条查询条件的结果,或者在事先已经知道查询语句仅仅会返回一条结果的情况下,我们可以在查询语句的结尾后添加 “limit 1” 字段以便在查询到结果后中断对剩余表单的检索,对比如下:
首先我们对表执行查询语句:1
select feature3 from pv_train_part1 where pv_train_part1.label=3 ;
查询时间如下:
可以看到,通过普通查询语句查询,其执行时间在 0.039 second。
然后对上述sql语句后添加 “limit 1” ,修改为:1
select feature3 from pv_train_part1 where pv_train_part1.label=3 limit 1;
查询时间如下:
可以看到,在添加limit 1后,其执行时间缩短为了 0.00049 second,相较于优化前的查询,效率提高了 203 倍。
通过这几个案例可以看出,SQL调优可以为数据库的查询操作提高近百倍的效率,是我们在开发大型工程中的必备知识。