时间:2024-04-15
同一个sql,不同的写法效率不同,但是问题来了,一般我们写的所谓的效率低的sql,都是在逻辑上最好理解,或者写出来最短,可读性最高的sql语句!执行效率搞的sql语句,大多是不太好理解,或者写起来很繁琐,可读性不如咱们的效率低的语句。
那么有没有好用的sql语句优化工具,自动能优化sql语句。
我也纳闷,这么牛逼的甲骨文,微软,国际商业机器公司,出的数据,为啥不能自动优化sql语句?自己按效率最高的方式执行!你写个语句,自动转换成效率最高的语句执行不就完了?
商用数据库的引擎中都有优化环节了,要不然,不定多慢。你开车非得刹车,自动驾驶也不能不让你刹车对吧?现在很多云上rds都提供了自动索引,这个上面尤其是微软和IBM做的比较多吧?可以看看,同样阿里云上的rds也都提供了自动索引。
有,但效果比较有限。不然,公司为啥还要雇人做这个?
自动优化sql有点人工智能了,其实工具离不开人,sql只是一个数据库工具而已,就想航母那么复杂,最后也需要人去维护,因此,如果有某种自动优化的辅助工具,人还是要理解SQL的原理。
逃不掉了,我感觉SQL优化不如先从复杂SQL逻辑理解入手,这样可能更接近这个问题的真相。
----
我可能是数据分析界,最能理解从SQL入门 到 工作中写SQL中间就差着一个 "复杂SQL“ 这句话的人了。当年为了写”复杂SQL“, 真的是为了工作中写 ”复杂SQL“, 整整花了我 300大洋,求教了一个老鸟才彻底的把我的SQL能力惊醒了。
---- 分隔符----
如果我没有猜错,90%的人都看过下面这本SQL神书:
另外99%的人都用过下面这些SQL练习网站:
[
自学SQL网(教程 视频 练习全套)](自学SQL)
这个网站特点是比较清晰简单,中文的,马上可以练习,主要训练查询能力
sqlzoo练习网站,牛客网SQL面试题 。。。。
----- 非常非常不幸,我也是这些练习网站的重度用户----
比如这个:
a我真的是从头到尾,把所有的练习题目过了一遍,感觉自身的SQL水平飞速上升。那感觉真的是没有哪个实际问题可以难倒我了。。
直到工作中遇到了 ”复杂SQL“, 才彻底败下阵来。
我就举一个例子:
SELECT sum(Domestic_sales+International_sales) as sum_sale,director,
count(*) as count,
sum(Domestic_sales+International_sales)/count(*) as avg_sale
FROM movies left join boxoffice on movies.id=boxoffice.movie_id
group by director
having count > 1
order by avg_sale
desc limit 1
---- 第一次看到这个SQL什么感觉?
好家伙,好像一切我见过的SQL知识点都用上了!但是我这个简单SQL的能力也彻底不知道怎么解释了。
幸好得到高人指点,最核心的一个思想是,不管多复杂的一个SQL,先要归结到最简单的SQL法则上。
凡是sql都分为,select,from,where 3段,你复杂的sql也是这3段。
只不过,复杂sql这3段都不简单,那既然这样,我们就把它分开来解决就好了。
比如上面的复杂sql,我们先解决from这一段,
SELECT *
FROM movies left join boxoffice on movies.id=boxoffice.movie_id
where 1
你不要关心select 和 where的情况下,只关心这个from,并且想象一下这个from的联表之后生成了新的table,我们叫 t1吧。
这会,这条sql是不是一下就简单了。
--- t1 现在看一下t1的内容
把两个表连在一起,形成表t1,现在请你记住这个t1,我们的select 和 where操作都在t1上进行
---- 现在我们把group等结果集操作放到一边,我们先只关心select部分。
SELECT sum(Domestic_sales+International_sales) as sum_sale,director,
count(*) as count,
sum(Domestic_sales+International_sales)/count(*) as avg_sale
FROM t1
#放一边
你看,这个简单SQL就是做了几个统计,每一个函数拆开来是不是很简单
--- 接下来,我们把select里的算法放在一边,我们去看看结果集的分组和排序
SELECT #
FROM t1
group by director
having count > 1
order by avg_sale
desc limit 1
一个复杂sql其实都是由简单的部分组成,只要你按照这个方法一层层的拆解,你会发现复杂sql不过如此!
---- 还有50个 SQL 性能优化 数据库 数据分析的资料可以进一步查看
专业的事交给专业的人!Navicat 数据库管理工具的一大亮点是支持自动美化SQL功能,欢迎下载免费全功能试用版。希望对您有用!
“查询设计器”是一个用于设计查询的 Navicat 基本工具。
SQL 编辑器让你创建和编辑 SQL 文本,准备和运行已选择的查询。你可以在一个查询窗口编写多句 SQL 语句。拖放或双击右侧的“标识符”窗格的一个标识符来将它添加到编辑器中。
【提示】当你使用 SQL 创建工具创建 SQL 时,SELECT 语句将会在 SQL 编辑器中自动生成。
Navicat 提供广泛的高级功能,例如:编辑代码功能、智能自动完成代码、设置 SQL 格式及更多。
若要更改 SQL 语句格式,简单地从“格式”菜单选择 -
缩进
为已选择的代码行增加或减少缩进。
注释
为已选择的代码行加上注释或取消注释。
转换大小写
将已选择的代码变为大写或小写。
美化 SQL(仅适用于非 Essentials 版本)
以美化 SQL 选项设置已选择的代码的格式。
美化 SQL 选项(仅适用于非 Essentials 版本)
更改 SQL 美化器的选项。
选项或按钮 | 描述 |
单行大括号字或符号限制 | 设置短括号的长度。 |
大写关键字 | 将全部 SQL 关键字转为大写。 |
美化 | 保存及应用 SQL 美化器的选项。 |
简化 SQL(仅适用于非 Essentials 版本)
简化 SQL 编辑器中的 SQL 格式。
在编辑器中输入 SQL 语句时,Navicat 的自动完成代码功能会弹出一个建议列表。它以语句完成和数据库对象的可用属性(例如:数据库、表、字段、视图等)加上其相应的图标来协助你完成语句。你可以更新代码建议,选择“编辑”->“自动完成代码”->“更新自动完成代码的信息”。
若要使用自动完成代码,只需简单地按“.”来显示在当前范围内的数据库对象的可用属性。
当建议列表出现时,按 TAB 插入第一个项目。你还可以使用上箭头或下箭头选择所需的项目,然后按 TAB 或 ENTER。
此外,你可以输入一个字符或在你的键盘上按 ESC 来使用自动完成代码,以取得 SQL 关键字或数据库对象。
如果你从列表中选择一个代码段的名,已保存的代码会插入到编辑器中。
【提示】拖动建议列表的右下角来调整其大小。
你可以在选项中启用或禁用自动完成代码功能。
当你在编辑器中照常复制或剪切某些代码时,复制的内容也将添加到剪贴板堆栈中。剪贴板堆栈最多可存储 10 个项目,并使用后进先出的逻辑。若要从剪贴板堆栈粘贴项目,可以按 CTRL+SHIFT+V。按 CTRL+SHIFT+V 多次可以循环浏览剪贴板堆栈。
代码折叠功能让你折叠代码,代码块只会显示代码的第一行在 SQL 编辑器中。
Navicat 支持在编辑器中高亮显示成对的括号,即 ()。
【注意】光标必须在括号上才能显示高亮显示。
有性能问题,上HeapDump性能社区!
不同的业务场景,不同的设计思路,对应的“高效”标准不一样,所以优化的思路肯定很难标准化。
如果真有这样的工具存在,那也肯定得是人工智能了,简单的代码优化工具,很多框架里已经有了,但是要实现你说的这种功能,估计路还很长。
而且真的要是出现了,估计我们离淘汰也不远了!哈哈
所以现阶段,我们还是好好的学习SQL优化技巧吧: