加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

如何去写一手好SQL

发布时间:2019-10-29 06:19:03 所属栏目:建站 来源:今头日条一小马奔腾
导读:副标题#e# MySQL性能 数据表设计 索引优化 SQL优化 其他数据库 博主负责的项目主要采用阿里云数据库MySQL,最近频繁出现慢SQL告警,执行时间最长的竟然高达5分钟。导出日志后分析,主要原因竟然是没有命中索引和没有分页处理。其实这是非常低级的错误,我不

OR无法命中mobile_no + user_id的组合索引,可采用union,如下所示:

  1. (select id,product_name from orders where mobile_no = '13421800407') 
  2.  union 
  3. (select id,product_name from orders where user_id = 100); 

此时id和product_name字段都有索引,查询才最高效。

IN优化

IN适合主表大子表小,EXIST适合主表小子表大。由于查询优化器的不断升级,很多场景这两者性能差不多一样了。

尝试改为join查询,举例如下:

  1. select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP'; 

采用JOIN如下所示:

  1. select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP'; 

不做列运算

通常在查询条件列运算会导致索引失效,如下所示:

查询当日订单

  1. select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01'; 

date_format函数会导致这个查询无法使用索引,改写后:

  1. select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59'; 

避免Select all

如果不查询表中所有的列,避免使用SELECT *,它会进行全表扫描,不能有效利用索引。

Like优化

like用于模糊查询,举个例子(field已建立索引):

  1. SELECT column FROM table WHERE field like '%keyword%'; 

这个查询未命中索引,换成下面的写法:

  1. SELECT column FROM table WHERE field like 'keyword%'; 

去除了前面的%查询将会命中索引,但是产品经理一定要前后模糊匹配呢?全文索引fulltext可以尝试一下,但Elasticsearch才是终极武器。

Join优化

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读