网站建设,seo快速优化排名公司,网络营销推广,百度SEO">
在介绍具体的SQL调优的方法前,我们先来简单了解下MySQL调优金字塔理论。
上海网站建设,SEO快速优化排名公司,网络营销推广,百度SEO">
如上图所示,数据库优化维度有四个:硬件、系统配置、数据库表结构、SQL及索引。
优化成本:
硬件>系统配置>数据库表结构>SQL及索引
优化效果:
硬件<系统配置<数据库表结构<SQL及索引
我们可以看出数据库SQL语句效率调优是最省成本效果最好的办法,也就是结构设计上的优化。本文我们就来谈谈MySQL中常用的SQL优化方法,利用好这些方法会让你的MySQL效率提高提升至少3倍。
1、EXPLAIN做MySQL优化,我们要善用EXPLAIN查看SQL执行计划。
下面来个简单的示例,标注(1、2、3、4、5)我们要重点关注的数据:
•Type列,连接类型。一个好的SQL语句至少要达到Range级别。杜绝出现All级别。•Key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。•Key_Len列,索引长度。•Rows列,扫描行数。该值是个预估值。•Extra列,详细说明。注意,常见的不太友好的值,如下:Usingfilesort,Usingtemporary。
2、SQL语句中IN包含的值不应过多MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。
再例如:SelectIdFromTwhereNumIN(1,2,3)对于连续的数值,能用Between就不要用IN了;再或者使用连接来替换。
3、Select语句务必指明字段名称Select*会增加很多不必要的消耗(如:CPU、IO、内存、网络带宽等),增加了使用覆盖索引的可能性。
当表结构发生改变时,前断也需要更新。所以要求直接在Select后面接上字段名。
4、当只需要一条数据的时候,使用Limit1这是为了使EXPLAIN中Type列达到Const类型。
5、如果排序字段没有用到索引,就尽量少排序
6、如果限制条件中其他字段没有索引,尽量少用OROR两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用UnionAll或者是Union(必要的时候)的方式来代替OR会得到更好的效果。
7、尽量用UnionAll代替UnionUnion和UnionAll的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,UnionAll的前提条件是两个结果集没有重复数据。
8、不使用 ORDERBY RAND()
SelectIdFrom`dynamic`OrderByrand()Limit1000;
继续了解相关服务
如果你正在评估 GEO、SEO、软件开发或智能体落地,可以从服务页继续了解适合企业的增长方案。
GEO 生成式引擎优化 · SEO 搜索优化 · 软件开发 · 智能体开发