小魔女 发表于 2015-1-16 22:44:30

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必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。

admin 发表于 2015-1-19 21:57:13

分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。

仓酷云 发表于 2015-1-28 13:02:29

个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。

小妖女 发表于 2015-2-5 21:34:28

having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。

飘灵儿 发表于 2015-2-13 17:01:05

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

爱飞 发表于 2015-3-4 00:31:07

原来的计算字段其实和虚拟字段很像。只是管理方面好了而已,性能方面提高不多。但是SQL2005提供了计算字段的持久化,这就提高了查询的性能,但是会加重insert和update的负担。OLTP慎用。OLAP可以大规模使用。

老尸 发表于 2015-3-19 00:32:12

这一点很好的加强了profiler的功能。但是提到profiler提醒大家注意一点。windows2003要安装sp1补丁才能启动profiler。否则点击没有反应。

海妖 发表于 2015-3-26 23:23:52

以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
页: [1]
查看完整版本: MYSQL网页编程之SQL优化思索