| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> sql优化常用的几种方法 -> 正文阅读 |
|
[大数据]sql优化常用的几种方法 |
1.EXPLAIN
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.如果限制条件中其他字段没有索引,尽量少用oror两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用union all或者是union(必要的时候)的方式来代替“or”会得到更好的效果。 7.尽量用union all代替unionunion和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。 8.区分in和exists、not in和not existsselect * from 表A where id in (select id from 表B) 上面SQL语句相当于 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语句: select colname … from A表 where a.id not in (select b.id from B表) 高效的SQL语句: select colname … from A表 Left join B表 on where a.id = b.id where b.id is null 取出的结果集如下图表示,A表不在B表中的数据 前提,开启慢sql一、慢查询
4、设置日志路径和未使用索引的查询(有默认值,可以不设置) 二、慢查询时间设置。默认情况下long_query_time的值为10秒,可以使用命令修改,也可以在my.cnf参数里面修改。
explainhttp://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html https://www.cnblogs.com/tufujie/p/9413852.html sql优化15点
1.避免使用select *实际业务场景中不需要所有的字段,只需要其中一两个,只查找用到
2.用union all 代替unionunion会排重 3.小表驱动大表in 的话里面驱动外面,in适合里子查询是小表 4.批量插入mybatis plus 的insertBatch 5.多用limit6.in中值太多查询出来数量太大,限制一次最大查询条数 还可以,多线程查询,最后把查询出来的数据汇总。 7.增量查询select name,age from user where id>#{lastId} limit 100; 8.高效的分页
mysql会查询10020条,然后丢弃前面10000条,这个比较浪费资源 可以优化:
找到上次分页最大id 假如id是连续的,并且有序,可以用between 9.用连接查询代替子查询MySQL如果需要在两张以上表中查询数据的话,一般有两种实现方式
子查询可以通过in实现,优点:这样简单,
10.join表不宜过多阿里巴巴开发者手册规定,join表不宜超过3个 如果join太多,MySQL在选择索引时会非常复杂,很容易选错索引。 11.join时需要注意join用的最多的时left join 和 inner join inner join mysql会自动选择小表驱动, 12.控制索引数量索引不是越多越好,索引需要额外的存储空间,B+树保存索引,额外的性能消耗。 13.选择合理的字段类型char:固定字符串类型,该类型在的字段在存储空间上是固定的,固定长度的可以用
14.提升group by效率主要功能去重,分组
这种写法就不好,
15.索引优化强制走哪个索引
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:43:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |