A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

下面是 5 个关于索引和 SQL 查询性能的测试题;其中 4 个题目都是答案二选一,1 个题目是三选一。只要答对 3 个就算及格,是不是貌似很简单?但实际上只有 40% 的人能够及格。我们在测试题的后面会给出答案解析,不过建议你先尝试一下,看看答对几个!

测试题

问题 1

以下查询语句有没有性能问题?

选项 A:没问题;选项 B:有问题。

问题 2

以下查询语句有没有性能问题?

选项 A:没问题;选项 B:有问题。

问题 3

下表中的索引有没有问题?

选项 A:没问题;选项 B:有问题。

问题 4

以下查询语句有没有性能问题?

选项 A:没问题;选项 B:有问题。

问题 5

假如存在以下表和两个查询语句,哪个查询更快?

选项 A:第一个查询更快;选项 B:第二个查询更快;选项 C:两个查询性能差不多。

解析

问题 1

答案是:B,性能有问题。因为在索引字段上使用函数或者表达式,会导致索引失效。

你可以使用 EXPLAIN 命令查看该语句的执行计划,最好先执行一次表的统计分析:

Oracle 中是全表扫描,没有走索引。再看 MySQL:

MySQL 虽然使用了索引,但是也需要对索引进行转换判断;并不是最优方案。

接下来是 SQL Server:

SQL Server 使用了索引,但是也需要对索引进行转换判断;并不是最优方案。

最后看一下 PostgreSQL:

PostgreSQL 使用的是全表扫描,没有使用索引。

正确做法是修改查询语句:

备注:使用函数索引并不是最优解决方法,它只能用于特定的查询条件;如果查询条件改成 TO_CHAR(dt, 'YYYY-MM-DD') = '2019-06-01'或者其他形式就无法使用该索引了。

问题 2

答案是:A,性能没有问题。该语句的 WHERE 子句以及 ORDER BY 子句都可以使用索引(反向扫描),不需要对任何行进行额外的排序。可以使用上面的方法查看执行计划。

问题 3

答案是:B,索引有问题。因为第二个查询无法使用索引或者效率不高。虽然有些数据库可能采用索引跳跃扫描,但是可以通过修改索引字段的顺序获得更好的性能:

将 col2 放在索引的最左端,两个查询都可以利用索引;也就是说,复合索引应该遵循最左前缀原则。另外,基于 col2 再创建一个索引会导致索引重复,不是好的方案。

问题 4

答案是:B,性能有问题。因为在 LIKE 条件中以通配符 % 或者 _ 开始的字符串无法使用索引。不过,以下语句可以使用索引:

对于 PostgreSQL 而言,还需要在创建索引时指定操作符类:

问题 5

答案是:A,第一个查询更快。因为它只需要通过扫描索引(Index-Only Scan)就可以得到结果;第二个查询虽然可能返回的数据更少,但是需要通过索引访问表,也就是回表。


————————————————

原文链接:「董旭阳TonyDong」 https://blog.csdn.net/horses/article/details/103028340

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马