查询优化:
1、使用where子句过滤数据:使用where子句过滤掉没用的数据可以提高检索时间和降低网络传输的数据流量。
在where子句中尽量避免使用函数。
2、连接查询多个表而不是执行多个查询
在连接查询中,尽量避免使用视图。因为视图的运行效率远低于直接使用表的效率。另外,连接多个表时,连接顺序也非常重要。通常,数据
比较多的表应该先进行连接,数据比较少的尽可能后进行连接。例如books表中包含了3000行数据,authors表中有500条数据,而write_book表
中有8000行数据,那么应该先执行books表和write_book表之间的连接,然后再与authors表连接。
3、使用case表达式而不是执行多个查询
在对表中数据进行计算时,应该尽量地使用case子句,而避免使用多个查询。通过减少查询语句的数量,提高查询语句的执行效率。
4、在连接查询中使用完全限定的列名引用
在查询语句中,应该养成总是使用表的别我并且总是使用这些别名限制使用到的列名称的习惯。这样,系统在执行查询时,就会根据限定的表
的名称直接搜索到相应的列名称。特别是执行表的连接操作中,即使不使用完全限定的列名也可以得到正确的结果,那么也应该使用完全限定
的列名以便降低系统在表中搜索的时间。即使某个列我只在一个表中存在,但是系统是无法获取这种信息的,因此也就需要在两个表中进行搜
索,但是,如果使用了表的列名作为限定,系统就获取了这种信息,因此可以直接在相应表中去搜索指定名称的列。
5、在表中增加索引
索引优点是加快数据的检索速度,但是索引的缺点是增加了数据维护的成本。
添加索引进尽可能遵循以下5个原则:
一、对于以检索操作为主的表,多增加索引
二、对于表中的某列来说,如果返回的数据量通常占到表中全部数据量的很少一个比率,应该在这些列上创建索引。
三、在执行层次查询时,应该在被引用列上创建索引,以便提高层次查询过程中数据引用的效率。
四、应该尽可能地使用复合索引。复合索引是由多个列组成的索引。
五、在经常执行连接查询的列上,应该创建索引。
6、使用where子句而不是使用having子句
where和having子句都可过滤数据,但having子句主要过滤不满足分组条件的数据。由于having子句过滤的数据是那些已被检索出来的数据,而
where子句过滤的数据是那些还没有被检索出来的数据。因此如果能用where子句过滤的数据,则一定不要用having子句。
7、使用union all关键字而不是使用union关键字
union all关键字将两个查询语句的结果联合起来,并且不删除查询结果中出现的冗余数据。如果用union关键字将两个查询语句结果联合起来
,那么将删除查询结果中冗余出现的数据。由于这种删除冗余值的操作非常耗时间,因此如果不需要删除冗余数据,那么应尽可能地使用union all,不用union。
8、使用连接查询和子查询都能完成的操作,要用连接查询,因为从内部来看,连接查询的算法效率比子查询要高。
9、exists和in都能使用的地方,要用exists,因为exists强调存在,in强调在不在一个组内,要进行比较。