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

巧用这19条MySQL优化,服从至少进步3倍

发布时间:2019-01-18 10:48:31 所属栏目:编程 来源:喜欢拿铁的人
导读:本文我们来谈谈项目中常用的MySQL优化要领,共19条,详细如下: 1、EXPLAIN 做MySQL优化,我们要善用EXPLAIN查察SQL执行打算。 下面来个简朴的示例,标注(1、2、3、4、5)我们要重点存眷的数据: type列,毗连范例。一个好的SQL语句至少要到达range级别。杜
副问题[/!--empirenews.page--]

巧用这19条MySQL优化,服从至少进步3倍

本文我们来谈谈项目中常用的MySQL优化要领,共19条,详细如下:

1、EXPLAIN

做MySQL优化,我们要善用EXPLAIN查察SQL执行打算。

下面来个简朴的示例,标注(1、2、3、4、5)我们要重点存眷的数据:

巧用这19条MySQL优化,服从至少进步3倍

  • type列,毗连范例。一个好的SQL语句至少要到达range级别。杜绝呈现all级别。
  • key列,行使到的索引名。假如没有选择索引,值是NULL。可以采纳逼迫索引方法。
  • key_len列,索引长度。
  • rows列,扫描行数。该值是个预估值。
  • extra列,具体声名。留意,常见的不太友爱的值,如下:Using filesort,Using temporary。

2、SQL语句中IN包括的值不该过多

MySQL对付IN做了响应的优化,即将IN中的常量所有存储在一个数组内里,并且这个数组是排好序的。可是假如数值较多,发生的耗损也是较量大的。再譬喻:select id from t where num in(1,2,3) 对付持续的数值,能用between就不要用in了;再可能行使毗连来替代。

3、SELECT语句务必指明字段名称

SELECT*增进许多不须要的耗损(CPU、IO、内存、收集带宽);增进了行使包围索引的也许性;当表布局产生改变时,前断也必要更新。以是要求直接在select后头接上字段名。

4、当只必要一条数据的时辰,行使limit 1

这是为了使EXPLAIN中type列到达const范例

5、假如排序字段没有效到索引,就只管少排序

6、假如限定前提中其他字段没有索引,只管罕用or

or双方的字段中,假若有一个不是索引字段,而其他前提也不是索引字段,会造成该查询不走索引的环境。许多时辰行使union all可能是union(须要的时辰)的方法来取代“or”会获得更好的结果。

7、只管用union all取代union

union和union all的差别首要是前者必要将功效集归并后再举办独一性过滤操纵,这就会涉及到排序,增进大量的CPU运算,加大资源耗损及耽误。虽然,union all的条件前提是两个功效集没有一再数据。

8、不行使ORDER BY RAND()

  1. select id from `dynamic` order by rand() limit 1000; 

上面的SQL语句,可优化为:

  1. select id from `dynamic` t1 join (select rand() * (select max(id) from `dynamic`) as nid) t2 on t1.id > t2.nidlimit 1000; 

9、区分in和exists、not in和not exists

  1. select * from 表A where id in (select id from 表B) 

上面SQL语句相等于

  1. select * from 表A where exists(select * from 表B where 表B.id=表A.id) 

区分in和exists首要是造成了驱动次序的改变(这是机能变革的要害),假如是exists,那么以外层表为驱动表,先被会见,假如是IN,那么先执行子查询。以是IN得当于外表大而内表小的环境;EXISTS得当于外表小而内表大的环境。

关于not in和not exists,保举行使not exists,不只仅是服从题目,not in也许存在逻辑题目。怎样高效的写出一个更换not exists的SQL语句?

原SQL语句:

  1. select colname … from A表 where a.id not in (select b.id from B表) 

高效的SQL语句:

  1. select colname … from A表 Left join B表 on where a.id = b.id where b.id is null 

取出的功效集如下图暗示,A表不在B表中的数据:

巧用这19条MySQL优化,服从至少进步3倍

10、行使公道的分页方法以进步分页的服从

  1. select id,name from product limit 866613, 20 

行使上述SQL语句做分页的时辰,也许有人会发明,跟着表数据量的增进,直接行使limit分页查询会越来越慢。

优化的要领如下:可以取前一页的最大行数的id,然后按照这个最大的id来限定下一页的出发点。好比此列中,上一页最大的id是866612。SQL可以回收如下的写法:

  1. select id,name from product where id> 866612 limit 20 

11、分段查询

在一些用户选择页面中,也许一些用户选择的时刻范畴过大,造成查询迟钝。首要的缘故起因是扫描行数过多。这个时辰可以通过措施,分段举办查询,轮回遍历,将功效归并处理赏罚举办展示。

如下图这个SQL语句,扫描的行数成百万级以上的时辰就可以行使分段查询:

巧用这19条MySQL优化,服从至少进步3倍

12、停止在where子句中对字段举办null值判定

对付null的判定会导致引擎放弃行使索引而举办全表扫描。

13、不提议行使%前缀恍惚查询

譬喻LIKE“%name”可能LIKE“%name%”,这种查询会导致索引失效而举办全表扫描。可是可以行使LIKE “name%”。

那怎样查询%name%?

(编辑:湖南网)

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

热点阅读