“SQL性能优化是一种黑魔法
就像炼金术一样:
各种配方难解晦涩,
只有一小部分圈内人才能理解。”
这是一种误解,SQL数据库使用的是大家公知的算法来实现可以预期的执行性能。然而,问题是,人们很容易写出不能发挥最高效算法的SQL查询语句,因而也容易产生无法预期的性能结果。
下面是5道关于SQL性能优化小测试题,这些测试题也许会让你坚信SQL优化就是一种黑魔法。但答案中提供的解释说明会随即让你明白,这些所谓的黑魔法其实是纯粹的科学。
本测试中使用的SQL是基于Oracle数据库。
单从性能的视角看,下面的这些SQL写法是好的还是不好的?
1、查询出年是2012的所有行:
-
- ✓ 没问题,不可能再有重大的改进。
- ✓ 有问题,还可以做重大的优化。
✓ X 答对了! 当表字段放到函数里执行查询时,索引将不起作用,效率更高的写法如图:
2、查询出最近日期的一行数据:
-
- ✓ 没问题,不可能再有重大的改进。
- ✓ 有问题,还可以做重大的优化。
✓ X 答对了! 这个SQL语句将会按照经过索引的 Top-N 查询方式执行,它的效率跟INDEX UNIQUE SCAN
是等效的,所以会非常快。
3、两个查询语句,通过一个普通列查询:
-
- ✓ 没问题,不可能再有重大的改进。
- ✓ 有问题,还可以做重大的优化。
✓ X 答对了! 建立的索引只能用于第一个查询,第二个SQL无法利用索引提高效率。
4、查询一个字符串:
-
- ✓ 没问题,查询效率会很快
- ✓ 有问题,可能会产生严重的性能问题
✓ X 答对了! like对应的查询字符如果是以通配符开头的,索引将无法发挥效能。也没有一个简单的方法来优化这种SQL
5、如果从百万行数据中查询出几千行时,我们使用:
而当我们只需要从百万行数据中查询出10行时,SQL可以改成这样:
-
- ✓ 两种情况下执行性能差不多(+/-10%)
- ✓ 要看是什么数据
- ✓ 修改后的SQL效率会很慢(降低至少10%)
- ✓ 修改后的SQL效率会很高(提高至少10%)
✓ X 答对了! 在前一种查询中,索引覆盖了所有的查询字段,执行效能会非常高,而修改后的SQL,虽然返回的数据变少了,但新增的B字段并没有索引。
【三分钟小测试】你对SQL性能优化知识知多少?
-
5道题中你答对了 {score} 题你对SQL性能优化技巧知之甚少。
-
5道题中你答对了 {score} 题你对SQL性能优化技巧了解一些,但也不是很全面。
-
5道题中你答对了 {score} 题你对SQL性能优化技巧知道很多,但仍可以进一步提高。
-
5道题中你答对了 {score} 题你很擅长SQL性能优化,看来是一个数据库高手
还不错.
还不错——————
第2道测试题:
里面那个语句的排序没有必要吧,多余,这样会降低的查询速度
这个语句是有问题的
应该用Max走
呵呵,不错。
5道题中你答对了 5 题
你很擅长SQL性能优化,看来是一个数据库高手
第二题有问题吧!
第二题有问题。
还不错,其中的一些都是在平时遇到的
答案没有?
不错不错哦~~~