SQL本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。
查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL语句的执行顺序、索引以及统计信息的采集等,甚至应用程序和系统的整体架构。本文介绍几个关键法则,可以帮助我们编写高效的SQL查询;尤其是对于初学者而言,这些法则至少可以避免我们写出性能很差的查询语句。以下法则适用于各种关系型数据库,包括但不限于:MySQL、Oracl、SQLSrvr、PostgSQL以及SQLit等。▍法则一:只返回需要的结果一定要为查询语句指定WHERE条件,过滤掉不需要的数据行。通常来说,OLTP系统每次只需要从大量数据中返回很少的几条记录;指定查询条件可以帮助我们通过索引返回结果,而不是全表扫描。绝大多数情况下使用索引时的性能更好,因为索引(B-树、B+树、B*树)执行的是二进制搜索,具有对数时间复杂度,而不是线性时间复杂度。以下是MySQL聚簇索引的示意图:举例来说,假设每个索引分支节点可以存储个记录,万(3)条记录只需要3层B-树即可完成索引。通过索引查找数据时需要读取3次索引数据(每次磁盘IO读取整个分支节点),加上1次磁盘IO读取数据即可得到查询结果。相反,如果采用全表扫描,需要执行的磁盘IO次数可能高出几个数量级。当数据量增加到1亿(4)时,B-树索引只需要再增加1次索引IO即可;而全表扫描则需要再增加几个数量级的IO。同理,我们应该避免使用SELECT*FROM,因为它表示查询表中的所有字段。这种写法通常导致数据库需要读取更多的数据,同时网络也需要传输更多的数据,从而导致性能的下降。??关于B-树索引的原理以及利用索引优化各种查询条件、连接查询、排序和分组以及DML语句的介绍,可以参考这篇文章: