百科问答小站 logo
百科问答小站 font logo



怎样才能写出高质量的SQL语句? 第1页

  

user avatar   a-li-ba-ba-tao-xi-ji-zhu 网友的相关建议: 
      

阿里工程师分享9个自己写SQL的好习惯。亲身实践所得,欢迎讨论交流。


【点击头像关注我们知乎号,别错过更多阿里工程师一线技术干货。】

——————————————————————————————————————


1、查询中尽量避免使用SELECT * 以及加上LIMIT限制

当服务器响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,然后让服务器停止发送。查询应尽可能只返回必要数据,减小通信数据包大小和数量,提高效率。


2、IN 和 NOT IN 要慎用,会导致全表扫描。



上面例子使用 IN 时可以用到索引,使用 NOT IN 时未使用索引。


上面例子使用 IN 时未使用索引。


MySQL优化器会选择代价最小的方式执行,IN和NOT IN 都可能索引失效,不是绝对的。


3、LIKE 导致全表扫描


LIKE导致索引失效是因为没遵循最佳左前缀法则。字符串B-Tree排序方式:先按照第一个字母排序,如果第一个字母相同,就按照第二个字母排序,以此类推。

%号放右边
由于B-Tree的索引顺序,是按照首字母的大小进行排序,前缀匹配又是匹配首字母。所以可以在B+树上进行有序的查找,查找首字母符合要求的数据。所以有些时候可以用到索引。


4、联合索引需遵循最佳左前缀法则


GLS_CODE,BARCODE,SKU_ID 创建了联合索引,当查询语句where条件中没有GLS_CODE列不会走联合索引。创建这种多列联合索引时,列的顺序非常重要。


B-Tree联合索引组合顺序与创建时列的顺序是一样的,第一个字段列的顺序是确定的,其他列的顺序都是不确定的。B-Tree索引的限制,如果查询不是按照索引创建时的顺序,则无法使用索引。


在查询中where条件里存在联合索引第一列,顺序不一致也是可以走索引的。这里是因为MySQL优化器会对查询重新排序。


5、不要在索引列上做任何操作


索引列存在计算、函数、类型转换,会导致索引失效进行全表扫描。


6、is null,is not null可能导致索引失效


7、要注意where,order by,group by后面的列,多表关联的列是否已加索引,优先考虑组合索引


添加索引


8、where后面的列要注意隐式转换,会导致索引失效


不加单引号时,是字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较,最后导致索引失效。


9、count(*) 和 count(1) 的误解


dev.mysql.com/doc/refma
count(*) 和 count(1) 效率是完全一样的,并没有count(1)会比count(*)快的说法。


(本篇作者:阿里巴巴天猫奢品运营中心 乂嵘)

——————————————————————————————————————————

阿里巴巴集团淘系技术部官方账号。淘系技术部是阿里巴巴新零售技术的王牌军,支撑淘宝、天猫核心电商以及淘宝直播、闲鱼、躺平、阿里汽车、阿里房产等创新业务,服务9亿用户,赋能各行业1000万商家。我们打造了全球领先的线上新零售技术平台,并作为核心技术团队保障了11次双十一购物狂欢节的成功。详情可查看我们官网:阿里巴巴淘系技术部官方网站

点击下方主页关注我们,你将收获更多来自阿里一线工程师的技术实战技巧&成长经历心得。另,不定期更新最新岗位招聘信息和简历内推通道,欢迎各位以最短路径加入我们。




  

相关话题

  你离职的公司经理突然找你,说让你回去上班,你们回吗? 
  网传快手大幅度裁员 30%,真实性如何?若属实被裁的员工何去何从? 
  都快 2022 年了,你们公司还有哪些落后的办公方式? 
  职场上,「做得越多死得越快」,有道理吗?为什么会这样呢? 
  如何看待「管理培训生」这个职位?需要培养哪些素质? 
  数据分析和挖掘在售电市场的应用价值点在哪儿? 
  如何看待一点资讯在九月九日举办的 996 职场社畜日? 
  拿到新公司offer后,需要提供解除劳动合同证明和近6个月银行流水,我尴尬了,下一步该怎么办? 
  遇到个傻逼领导是种怎样的体验? 
  为什么说年轻人过早的拿高薪不是好事? 

前一个讨论
电脑怎样执行编程语言的?
下一个讨论
计算机专业到底是不是“围城”?





© 2024-09-19 - tinynew.org. All Rights Reserved.
© 2024-09-19 - tinynew.org. 保留所有权利