作家
登录

你可能不知道的10条SQL技巧,涨知识了!

作者: 来源: 2017-12-06 11:52:07 阅读 我要评论

  1. select * from user where login_name=? and passwd=? 
  2.  
  3. select * from user where passwd=? and login_name=? 

原因:

B-Tree索引的时光复杂度是O(log(n))

Hash索引的时光复杂度是O(1)

(6)许可为null的列,萌芽有潜在大年夜坑

单列索引不存null值,复合索引不存全为null的值,如不雅列许可为null,可能会获得“不相符预期”的结不雅集

  1. select * from user where name != 'shenjian' 

如不雅name许可为null,索引不存储null值,结不雅集中不会包含这些记录。

所以,请应用not null束缚以及默认值。

(7)复合索引最左前缀,并不是值SQL语句的where次序要和复合索引一致

用户中间建立了(login_name, passwd)的复合索引

三、小众但有效的SQL实践

都可以或许射中索引

  1. select * from user where login_name=? 

也能射中索引,知足复合索引最左前缀

  1. select * from user where passwd=? 

不克不及射中索引,不知足复合索引最左前缀

(8)应用ENUM而不是字符串

ENUM保存的是TINYINT,别在列举中搞一些“中国”“北京”“技巧部”如许的字符串,字符串空间又大年夜,效力又低。

(9)如不雅明白知道只有一条结不雅返回,limit 1可以或许进步效力

可以优化为:


  1. select * from user where login_name=? limit 1 

原因:

你知道只有一条结不雅,但数据库并不知道,明白告诉它,让它主动停止游标移动

(10)把计算放到营业层而不是数据库层,除了节俭数据的CPU,还有意想不到的萌芽缓存优化效不雅

  1. select * from order where date < = CURDATE() 

这不是一个好的SQL实践,应当优化为:

  1. $curDate = date('Y-m-d'); 
  2.  
  3. $res = mysql_query( 
  4.  
  5.     'select * from order where date < = $curDate'); 

原因:

释放了数据库的CPU

(11)强迫类型转换会全表扫描

多次调用,传入的SQL雷同,才可以应用萌芽缓存

  1. select * from user where phone=13800001234 

你认为会射中phone索引么?大年夜错特错了,这个语句毕竟要怎么改?

最后,再加一条,不要应用select *(潜台词,文┞仿的SQL都不合格 =_=),只返回须要的列,可以或许大年夜大年夜的节俭数据传输量,与数据库的内存应用量哟。

思路比结论重要,欲望你有收成。

  1. select

      推荐阅读

      程序员,在你 40 岁之前,要有个 Plan B

    开辟者大年夜赛路演 | 12月16日,技巧立异,北京不见不散 简评:法度榜样员的职业生活和 NBA 篮球活动员大年夜致类似,你怎么看?跟着年纪的增长,法度榜样员可能要多想一想前程。但不管若>>>详细阅读


    本文标题:你可能不知道的10条SQL技巧,涨知识了!

    地址:http://www.17bianji.com/lsqh/39510.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)