IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> MySQL-进阶篇-SQL优化 -> 正文阅读

[大数据]MySQL-进阶篇-SQL优化

SQL的优化,大部分是依据索引进行的优化,所以索引比较重要。

优化方式优化描述
新增优化
【INSERT】①:批量插入数据②:手动控制事务③:主键顺序插入性能高于乱序插入
主键优化【PRIMARY KEY】即主键索引的优化,侧重于索引的设计原则
排序优化【ORDER BY】排序尽可能用到索引,对排序进行索引分析,进行优化
分组优化【GROUP BY】分组时尽可能用到索引字段
分页优化
【LIMIT】通过创建 覆盖索引 能够比较好地提高性能
计数优化
【COUNT()】count(字段) < count(主键) < count(1) ≈ count(*),尽量使用 count(*)
更新优化【UPDATE】InnoDB的行锁是针对索引加的锁,不是针对记录加的锁 ,并且该索引不能失效,否则会从行锁升级为表锁 。说白了:还是索引,update的where语句要涉及索引,才能行锁

一、新增优化

1、插入数据

1). 优化方案一 :批量插入数据

# 批量插入
  INSERT INTO DU_USER(userName,age,sex) SELECT UUID(),22,'男' FROM DGS;

2). 优化方案二 :手动控制事务

可以设定每1000条,就COMMIT一次,减少数据库的交互,提升效率。

START TRANSACTION ;
	INSERT INTO DU_USER(userName,age,sex) VALUES('HX',34,'男');
	INSERT INTO DU_USER(userName,age,sex) VALUES('DG',24,'男');
	INSERT INTO DU_USER(userName,age,sex) VALUES('HX',28,'男');
COMMIT;

3). 优化方案三 :主键顺序插入?

主键顺序插入,性能要高于乱序插入

主键乱序插入 : 8 1 9 21 88 2 4 15 89 5 7 3 
主键顺序插入 : 1 2 3 4 5 7 8 9 15 21 88 89

2、大批量插入数据?

?使用脚本插入数据如果一次性需要插入大批量数据(比如: 几百万的记录),使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入

# 设置全局参数local_infile为1,开启从本地加载文件导入数据的开关 
  set global local_infile = 1; 
# 执行load指令将准备好的数据,加载到表结构中 
  load data local infile '/root/sql1.log' into table tb_user fields terminated by ',' lines terminated by

二、主键优化

知识回顾:InnoDB引擎中,数据行是记录在逻辑结构 page 页中的,而每一个页的大小是固定的,默认16K。 那也就意味着, 一个页中所存储的行也是有限的,如果插入的数据行row在该页存储不小,将会存储到下一个页中,页与页之间会通过指针连接。

注意:页和页之间是根据主键排列的,如果乱序插入,会存在页分裂和页合并的情况【类似于数组,在中间插入的时候会把后面的数据往后放,会出现数据移位】;如果主键顺序插入,就不会存在上面情况。

为了避免上面这种情况,所以需要对索引进行设计优化:

索引设计原则

1满足业务需求的情况下,尽量降低主键的长度。
2插入数据时,尽量选择顺序插入,选择使用AUTO_INCREMENT自增主键。
3尽量不要使用UUID做主键或者是其他自然主键,如身份证号。
5业务操作时,避免对主键的修改。

三、排序优化

1
根据排序字段建立合适的索引,多字段排序时,也遵循最左前缀法则。
2尽量使用覆盖索引。【防止回表查询;排序字段,都有索引】
3多字段排序, 一个升序一个降序,此时需要注意联合索引在创建时的规则(ASC/DESC)。
4
如果不可避免的出现 filesort ,大数据量排序时,可以适当增大排序缓冲区大小sort_buffer_size(默认 256k)
Using filesort?
通过表的索引或全表扫描, 读取满足条件的数据行 ,然后在排序缓冲区 sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。
Using index?
通过有序索引顺序扫描直接返回有序数据,这种情况即为 using index ,不需要
额外排序,操作效率高。

四、分组优化

1
在分组操作时,可以通过索引来提高效率。
2分组操作时,索引的使用也是满足最左前缀法则的。

五、分页优化

通过创建 覆盖索引 能够比较好地提高性能,可以通过 覆盖索引 子查询 形式进行优化。
explain select * from tb_sku t , (select id from tb_sku order by id limit 2000000,10) a where t.id = a.id;

六、计数优化

count() 是一个聚合函数,对于返回的结果集,一行行地判断,如果 count 函数的参数不是NULL,累计值就加 1,否则不加,最后返回累计值。【NULL值不计数】

count用法含义
count(主键)InnoDB引擎会遍历整张表,把每一行的 主键id 值都取出来,返回给服务处。服务层拿到主键后,直接按进行累加(主键不可能为NULL)
count(字段)
无NOT NULL约束InnoDB 引擎会遍历整张表,把每一行的字段值都取出来,返回给服务层,服务层判断是否为NULL,不为NULL,计数累加。
有NOT NULL约束InnoDB 引擎会遍历整张表,把每一行的字段值都取出来,返回给服务层,直接计数累加。
count(数字)Inno DB 引擎遍历整张表,但不取值。服务层对于返回的每一行,放一个数字1进去,直接按行进行累加。
count(? ?*? )Inno DB 引擎并不会取全部字段,而是专门做了优化,不取值,服务层直接按行进行累加。

七、更新优化

更新数据的时候,尽可能用到索引,因为InnoDB存储引擎下的索引是对行操作的,更新数据的时候会对行进行加锁,从而提升效率;如果不做索引,行锁会升级为表锁,效率变慢。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-07 11:15:14  更:2022-05-07 11:18:19 
 
开发: 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/23 23:56:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码