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语句优化 -> 正文阅读

[大数据]MySQL语句优化



1、MySQL的执行顺序

  1. from 如果有笛卡尔积就会和另外一张表生成中间表Temp1
  2. on 筛选关联表符合表达式的数据,由Temp1生成Temp2
  3. where 过滤不符合条件的数据
  4. group by 分组
  5. having 对分组后的记录进行聚合
  6. select 属性筛选
  7. distinct 去重
  8. order by 排序
  9. limit 限制返回记录

2、基础SQL优化

2.1建表优化

使用varchar代替char

例:

#正例
 create table course(cname varchar(50));
#反例
 create table course(cname char(50));

理由:

  • varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间
  • char按声明大小存储,不足补空格
  • 其次对于查询来说,在一个相对较小的字段内搜索,效率更高

使用数值代替字符串类型

  • 主键(id):primary key优先使用数值类型如int
  • 性别(sex):0-代表女,1-代表男;

字段设置为not null

? 尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。

批量插入性能提升

INSERT INTO student (id,name) VALUES(1,'lyf'),(2,'lyc');
  • 默认新增SQL有事务控制,导致每条都需要事务开启和事务提交;而批量处理是一次事务开启和提交。

2.2查询优化

select 具体字段

#正例
SELECT id,name FROM stu
#反例
SELECT * FROM stu
  • 只取需要的字段,节省资源
  • select * 查询时,可能不会用到索引,造成全表扫描

避免在where子句中使用or来连接条件

#正例
SELECT id,name FROM stu where id=1
SELECT id,name FROM stu where age=18
#反例
SELECT id,name FROM stu where age=18 or id=1
  • 使用or可能会使索引失效,从而全表扫描
  • 对于or没有索引的这种情况,假设它走了id的索引,但是走到查询条件时,它还得全表扫描。也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定。虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的

连续查询尽量用between

? 在连续数值的查询中,能使用between的情况下,尽量使用between,而不使用in。in和not in可能会导致全表查询。

多表查询用join

多表查询数据,使用inner join,left/right join来代替子查询。因为子查询需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。

使用like时能用只用一个%就不建议用%%

? 双%查询会导致mysql引擎放弃使用索引而进行全表扫描查询,查询时尽量把%放后面,或者不适用%。

精确属性类型匹配

? 例如:select id from user where id=‘3’;如果id 建立的varchar类型的走索引,如果写成select id from user where id=3不走索引。

使用limit限制返回记录数

? 如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。同时大量数据返回可能没有实际意义。如返回上千条甚至更多,用户也看不过来。就可以用limit进行分页。

不要有超过5个以上的表连接

  • 关联的表个数越多,编译的时间越大
  • 每次关联内存中都生成一个临时表
  • 应该把连接表拆开成较小的几个执行,可读性更高
  • 阿里规范中,建议多表联查三张表以下

inner 、left 、right join,优先使用inner join

三种连接如果结果相同,优先使用inner join,如果使用left join左边表尽量小

  • inner join是等值连接,返回的行数比较少,所以性能相对会好一点
  • 使用左连接,左边表数据结果尽量小,条件尽量放到左边处理,意味着返回的行数可能比较少。这是mysql优化原则,就是小表驱动大表,小的数据集驱动大的数据集,从而让性能更优

尽量使用union all替代union

SELECT * FROM ...
UNION ALL
SELECT * FROM ...
  • union和union all的区别是,union会自动去掉多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复
  • union:对两个结果集进行并集操作,去重不包括重复行,相当于distinct,同时进行默认规则的排序

先过滤再分组

select id,sex from stu 
where 表达式
group by sex;
  • 把不需要的记录过滤掉再分组
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:30:00  更:2022-07-17 16:34:08 
 
开发: 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年5日历 -2024/5/20 0:01:35-

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