SQL 优化极简法则与优化方法.docx
《SQL 优化极简法则与优化方法.docx》由会员分享,可在线阅读,更多相关《SQL 优化极简法则与优化方法.docx(11页珍藏版)》请在优知文库上搜索。
1、目录法则一:只返回需要的结果法则二:确保查询使用了正确的索引法则三:尽量避免使用子查询法则四:不要使用OFFSET实现分页法则五:了解SQ1.子句的逻辑执行顺序总结方法SQ1.作为关系型数据库的标准语言,是IT从业人员必不可少的技能之一。SQ1.本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQ1.语句的执行顺序、索引以及统计信息的采集等,甚至应用程序和系统的整体架构。本文介绍几个关键法则,可以帮助我们编写高效的SQ1.查询;尤其是对于初学者而言,这些法则至少可以避免我们写
2、出性能很差的查询语句。以下法则适用于各种关系型数据库,包括但不限于:MySQ1.OracleSQ1.ServerPostgreSQ1.以及SQ1.ite等。法则一:只返回需要的结果一定要为查询语句指定WHERE条件,过滤掉不需要的数据行。通常来说,O1.TP系统每次只需要从大量数据中返回很少的几条记录;指定查询条件可以帮助我们通过索引返回结果,而不是全表扫描。绝大多数情况下使用索引时的性能更好,因为索引(B-树、B+树、B*树)执行的是二进制搜索,具有对数时间复万(1003)条记录只需要3层B-树即可完成索引。通过索引查找数据时需要读取3次索引数据(每次磁盘IO读取整个分支节点),加上1次磁盘
3、IO读取数据即可得到查询结果。相反,如果采用全表扫描,需要执行的磁盘IO次数可能高出几个数量级。当数据量增加到1亿(1004)时,B-树索引只需要再增加1次索引IO即可;而全表扫描则需要再增加几个数量级的10。同理,我们应该避免使用SE1.ECT*FROM,因为它表示查询表中的所有字段。这种写法通常导致数据库需要读取更多的数据,同时网络也需要传输更多的数据,从而导致性能的下降。法则二:确保查询使用了正确的索引如果缺少合适的索引,即使指定了查询条件也不会通过索引查找数据。因此,我们首先需要确保创建了相应的索引。一般来说,以下字段需要创建索引:经常出现在WHERE条件中的字段建立索引可以避免全表扫
4、描;将ORDERBY排序的字段加入到索引中,可以避免额外的排序操作;多表连接查询的关联字段建立索引,可以提高连接查询的性能;将GRoUPBY分组操作字段加入到索引中,可以利用索引完成分组。即使创建了合适的索引,如果SQ1.语句写的有问题,数据库也不会使用索引。导致索引失效的常见问题包括:在WHERE子句中对索引字段进行表达式运算或者使用函数都会导致索引失效,这种情况还包括字段的数据类型不匹配,例如字符串和整数进行比较;使用1.IKE匹配时,如果通配符出现在左侧无法使用索引。对于大型文本数据的模糊匹配,应该考虑数据库提供的全文检索功能,甚至专门的全文搜索引擎(Elasticsearch等);如果
5、WHERE条件中的字段上创建了索引,尽量设置为NOTNU1.1.;不是所有数据库使用1SNOTNU1.1.判断时都可以利用索引。执行计划(executionplan,也叫查询计划或者解释计划)是数据库执行SQ1.语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果SQ1.语句性能不够理想,我们首先应该查看它的执行计划,通过执行计划(EXP1.AlN)确保查询使用了正确的索引。法则三:尽量避免使用子查询以MySQ1.为例,以下查询返回月薪大于部门平均月薪的员工信息:ExplainanalyzeSE1.ECTemp_id,emp_nameFROMemplo
6、yeeeWHEREsalary(SE1.ECTAVG(salary)FROMemployeeWHEREdept_id=e.dept_id);Filter:(e.salary(select#2)(cost=2.75rows=25)(actualtime=0.232.4.401rows=6loops=1)Tablescanone(cost=2.75rows=25)(actualtime=0.099.0.190rows=251oops=1)Select#2(subqueryincondition;dependent)Aggregatezavg(employee.salary)(actualtime=
7、0.147.0.149rows=lloops=25)Indexlookuponemployeeusingidx_emp_dept(dept_id=e.dept_id)(cost=1.12rows=5)(actualtime=0.068.0.104rows=7loops=25)从执行计划可以看出,MySQ1.中采用的是类似Nested1.oopJoin实现方式;子查询循环了25次,而实际上可以通过一次扫描计算并缓存每个部门的平均月薪。以下语句将该子查询替换为等价的JOIN语句,实现了子查询的展开(SubqueryUnnest):ExplainanalyzeSE1.ECTe.emp_id,e.em
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- SQL 优化极简法则与优化方法 优化 法则 方法
