当前位置: 首页 > news >正文

建好了网站怎么做外贸怎样做网站流量统计

建好了网站怎么做外贸,怎样做网站流量统计,南阳网站seo,公众号开发人员名单一:参数是子查询时#xff0c;使用 EXISTS 代替 IN 如果 IN 的参数是1, 2, 3 这样的数值列表#xff0c;一般还不需要特别注意。但是如果参数是子查询#xff0c;那么就需要注意了。在大多时候#xff0c;[NOT] IN 和 [NOT] EXISTS 返回的结果是相同的。但是两者用于子查询…一:参数是子查询时使用 EXISTS 代替 IN 如果 IN 的参数是1, 2, 3 这样的数值列表一般还不需要特别注意。但是如果参数是子查询那么就需要注意了。在大多时候[NOT] IN 和 [NOT] EXISTS 返回的结果是相同的。但是两者用于子查询时EXISTS 的速度会更快一些。我们试着从 Class_A 表中查出同时存在于 Class_B 表中的员工。下面两条SQL 语句返回的结果是一样的但是使用 EXISTS 的 SQL 语句更快一些。 -- 慢 SELECT * FROM Class_A WHERE id IN (SELECT id FROM Class_B);-- 快 SELECT * FROM Class_A A WHERE EXISTS (SELECT * FROM Class_B B WHERE A.id B.id);使用 EXISTS 时更快的原因有以下两个。 如果连接列id 上建立了索引那么查询 Class_B 时不用查实际的表只需查索引就可以了。如果使用 EXISTS 那么只要查到一行数据满足条件就会终止查询不用像使用 IN 时一样扫描全表。在这一点上 NOT EXISTS 也一样。 当 IN 的参数是子查询时数据库首先会执行子查询然后将结果存储在一张临时的工作表里内联视图然后扫描整个视图。很多情况下这种做法都非常耗费资源。使用 EXISTS 的话数据库不会生成临时的工作表。 要想改善 IN 的性能除了使用 EXISTS 还可以使用连接。前面的查询语句就可以像下面这样“扁平化”。 -- 使用连接代替IN SELECT A.id, A.name FROM Class_A A INNER JOIN Class_B B ON A.id B.id;这种写法至少能用到一张表的“id”列上的索引。而且因为没有了子查询所以数据库也不会生成中间表。我们很难说与 EXISTS 相比哪个更好但是如果没有索引那么与连接相比可能 EXISTS 会略胜一筹。 二:避免排序 我们在查询的时候虽然我们没有想要进行排序但是在数据库内部频繁地进行着暗中的排序。因此对于我们来说了解都有哪些运算会进行排序很有必要会进行排序的代表性的运算有下面这些 group by 子句order by 子句聚合函数(sum、count、avg、max、min)distinct集合运算符(union、intersect、except)窗口函数(rank、row_number等) 1.使用union all 代替union select * from Class_A union select * from Class_B 这个会进行排序,如果不在乎结果中是否有重复数据可以使用union all 代替 union .这样就不会进行排序了 select * from Class_A union all select * from Class_B;2.使用exists 代替distinct 为了排除重复数据,distinct 也会进行排序。如果需要对两张表的连接结果进行去重可以考虑使用exists代替distinct,以避免排序 Items SalesHistory 问题:如何从上面的商品表Items中找出同时存在于销售记录表SalesHistory中的商品。简而言之就是找出有销售记录的商品,使用 IN 是一种做法。但是前面我们说过当 IN 的参数是子查询时使用连接要比使用 IN 更好。因此我们像下面这样使用item_no列对两张表进行连接。 SELECT I.item_no FROM Items I INNER JOIN SalesHistory SH ON I. item_no SH. item_no;因为是一对多的连接所以item_no列中会出现重复数据。为了排除重复数据我们需要使用 DISTINCT 。 SELECT DISTINCT I.item_no FROM Items I INNER JOIN SalesHistory SH ON I. item_no SH. item_no;但是使用distinct的时候会进行排序 其实更好的做法是使用 EXISTS 。 SELECT item_no FROM Items I WHERE EXISTS (SELECT * FROM SalesHistory SH WHERE I.item_no SH.item_no)这条语句在执行过程中不会进行排序。而且使用 EXISTS 和使用连接一样高效。 3.在极值函数中使用索引(MAX/MIN) 使用这两个函数时都会进行排序。但是如果参数字段上建有索引则 只需要扫描索引不需要扫描整张表。以刚才的表 Items 为例来说 SQL 语句可以像下面这样写。 SELECT MAX(item_no) FROM Items;这种方法并不是去掉了排序这一过程而是优化了排序前的查找速 度从而减弱排序对整体性能的影响。 4.能写在 WHERE 子句里的条件不要写在 HAVING 子句里 聚合后使用HAVING 子句过滤 SELECT sale_date, SUM(quantity) FROM SalesHistory GROUP BY sale_date HAVING sale_date 2007-10-01;聚合前使用WHERE 子句过滤 SELECT sale_date, SUM(quantity) FROM SalesHistory WHERE sale_date 2007-10-01 GROUP BY sale_date;虽然结果是一样的但是从性能上来看第二条语句写法效率更高。原因通常有两个。第一个是在使用 GROUP BY 子句聚合时会进行排序如果事先通过WHERE 子句筛选出一部分行就能够减轻排序的负担。第二个是在WHERE 子句的条件里可以使用索引。HAVING 子句是针对聚合后生成的视图进行筛选的但是很多时候聚合后的视图都没有继承原表的索引结构 。 三:索引是真的用到了吗 以下都是索引失效的现象1.索引字段上进行计算 select * from SomeTable whre col_1 * 1.1 100;这种索引就会失效,执行的时候会进行全表的扫描。优化的方法就是把运算的表达式放到查询条件的右侧 select * from SomeTable whre col_1 100 / 1.1;其实只要索引列上使用函数的时候索引列就会失效 select * from SomeTable where SUBTR(col_1,1,1)a2.使用 IS NULL 谓词 通常索引字段是不存在 NULL 的所以指定 IS NULL 和 IS NOT NULL 的话会使得索引无法使用进而导致查询性能低下。 select * from SomeTable where col_1 is null;3.使用否定形式 下面的几种否定形式也不能用到索引 !NOT IN select * from SomeTable where col_1 100;4.使用OR 在 col_1 和 col_2 上分别建立了不同的索引或者建立了col_1,col_2 这样的联合索引时如果使用 OR 连接条件那么要么用不到索引要么用到了但是效率比 AND 要差很多。 SELECT * FROM SomeTable WHERE col_1 100 OR col_2 abc;5.使用联合索引时列的顺序错误 假设存在这样顺序的一个联合索引col_1, col_2, col_3 。联合索引中的第一列col_1必须写在查询条件的开头而且索引中列的顺序不能颠倒。如果无法保证查询条件里列的顺序与索引一致可以考虑将联合索引 拆分为多个索引。 ○ SELECT * FROM SomeTable WHERE col_1 10 AND col_2 100 AND col_3 500; ○ SELECT * FROM SomeTable WHERE col_1 10 AND col_2 100 ; × SELECT * FROM SomeTable WHERE col_1 10 AND col_3 500 ; × SELECT * FROM SomeTable WHERE col_2 100 AND col_3 500 ; × SELECT * FROM SomeTable WHERE col_2 100 AND col_1 10 ;6.使用 LIKE 谓词进行后方一致或中间一致的匹配 × SELECT * FROM SomeTable WHERE col_1 LIKE %a; × SELECT * FROM SomeTable WHERE col_1 LIKE %a%; ○ SELECT * FROM SomeTable WHERE col_1 LIKE a%;7.进行默认的类型转换 × SELECT * FROM SomeTable WHERE col_1 10; ○ SELECT * FROM SomeTable WHERE col_1 10; ○ SELECT * FROM SomeTable WHERE col_1 CAST(10, AS CHAR(2));默认的类型转换不仅会增加额外的性能开销还会导致索引不可用可以说是有百害而无一利。虽然这样写还不至于出错但还是不要嫌麻烦在需要类型转换时显式地进行类型转换吧别忘了转换要写在条件表达式的右边。 四:减少中间表 在 SQL 中子查询的结果会被看成一张新表这张新表与原始表一样可以通过代码进行操作。这种高度的相似性使得 SQL 编程具有非常强的灵活性但是如果不加限制地大量使用中间表会导致查询性能下降。频繁使用中间表会带来两个问题一是展开数据需要耗费内存资源二是原始表中的索引不容易使用到特别是聚合时。因此尽量减 少中间表的使用也是提升性能的一个重要方法。1.灵活使用 HAVING 子句 对聚合结果指定筛选条件时使用 HAVING 子句是基本原则。不习惯使用 HAVING 子句的数据库工程师可能会倾向于像下面这样先生成一张中间表然后在 WHERE 子句中指定筛选条件。 SELECT * FROM (SELECT sale_date, MAX(quantity) AS max_qty FROM SalesHistory GROUP BY sale_date) TMP ←----- 没用的中间表 WHERE max_qty 10然而对聚合结果指定筛选条件时不需要专门生成中间表像下面这样使用 HAVING 子句就可以。 SELECT sale_date, MAX(quantity) FROM SalesHistory GROUP BY sale_date HAVING MAX(quantity) 10;HAVING 子句和聚合操作是同时执行的所以比起生成中间表后再执行的 WHERE 子句效率会更高一些而且代码看起来也更简洁。 × SELECT * FROM SomeTable WHERE col_1 10; ○ SELECT * FROM SomeTable WHERE col_1 10; ○ SELECT * FROM SomeTable WHERE col_1 CAST(10, AS CHAR(2));在面试中当面试官提出这一类问题按照上述的方法进行回答都是没有问题的但不仅在面试中平时练习就养成习惯是最好的。大多数同学都会觉得“麻烦”、“不做也没有什么影响”但是习惯总是慢慢养成的。拥有好习惯未来在工作中面对不同的数据量就可以游刃有余地选择不同的方法来降低完成时间从而提升工作效率。
http://www.hkea.cn/news/14316859/

相关文章:

  • 维护网站多少钱有没有网站做字体变形
  • 广州做网站推广的公司保险公司销售好做吗
  • 重庆平台网站建设哪里有平面设计素材网站哪个好
  • 商城网站功能介绍公司建设网站需求
  • 化妆品推广软文沈阳seo技术
  • 网站内容被攻击该怎么做设计制作散发寄递销售展示使用
  • 企业网站优化找哪家青海企业网站建设公司
  • 做个网站得花多少钱做网站用什么源码最好
  • 微软网站开发技术常见的网络广告
  • 佛山网站制作做多少钱文库网站建设
  • 网站托管代运营wordpress 自己的数据库
  • asp 网站 模板网站制作工作流程
  • 保定网站维护公司wordpress商家插件
  • 学校网站后台管理源码专注做动漫的门户网站
  • 红色好看的网站冲浪网站优化网
  • 做服务的网站吗企业网站建设的策划书
  • 网站副标题网站排名优化seo
  • 简单个人网站模板广告公司取名大全
  • 自己做的视频网站如何赚钱吗网站建设技术服务的方式是什么
  • 企业网站管理系统演示平台做外贸网站要花多少钱
  • 想自己做网站推广哪里有做网站
  • 西安模板建站定制栖霞酒店网站设计价格
  • 中国保密在线网站培训系统销客多微分销系统
  • 手机网站开发团队西安专业网站开发哪家好
  • 网站服务器排名网站的制作方案
  • 百度搜索引擎录入网站网站名称可以更换吗
  • 个人网站主机的配置摄影网页设计图片
  • 汕头网站建设模板制作企业cms wordpress
  • 网站价值如何评估萍乡网站建设哪家好
  • 网站建设有哪些环节泸州网站开发公司