MYSQL网页编程之SQL优化思索
表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。优化初进oracle殿堂的人,在学写SQL语句时一样平常会失掉一个教导,那就是exists比in更要高效,但细心设想如果真的这么复杂那爽性往失落in,岂不是省往良多贫苦?本人对这两种查询语句写法的熟悉也对照浅易,可是以为仍是对照无效,以是有乐趣的能够瞄一眼哦
......
先说IN
他相称对innertable实行一个个带有distinct的子查询语句,然后失掉的查询了局集再与outertable举行毗连,固然毗连的体例和索引的利用仍旧同于一般的两表毗连。
select*fromT1wherexin(selectyfromT2);
能够转换成以下
select*from
T1,(selectdistinctyfromT2)T2
whereT1.x=T2.y;
再说exists
实践上exists相称于对outertable举行全表扫描,用从中检索到的每行与innertable做轮回婚配输入响应的切合前提的了局,其次要开支是对outertable的全表扫描(fullscan),而毗连体例是nestedloop体例。
能够写成
select*fromT1whereexists(selectNULLfromT2whereT2.y=T1.x);
转换成
forcursor1in(select*fromT1)
loop
if(exists(selectNULLfromT2whereT2.y=cursor1.x))
then
前往婚配的纪录;
endif;
endloop;
经由过程下面的注释,如今很简单分明当T2数据量伟大且索引情形欠好(大批反复值等),则不宜利用发生对T2的distinct检索而招致体系开支伟大的IN操纵,反之当T1表数据量伟大(不受索引影响)而T2表数据较少且索引优秀则不宜利用引发T1全表扫描的EXISTS操纵,索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。 个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。 这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。 以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
页:
[1]