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性能优化

一、sql优化:

sql优化的五个原则:

  1. 减少数据访问:设置合理的字段类型,启用压缩,通过索引访问等减少磁盘IO
  2. 返回更少的数据:只返回需要的字段和数据分页处理 减少磁盘io及网络io
  3. 减少交互次数:批量DML操作,函数存储等减少数据连接次数
  4. 减少服务器CPU开销:尽量减少数据库排序操作以及全表查询,减少cpu 内存占用
  5. 利用更多资源:使用表分区,可以增加并行操作,更大限度利用cpu资源

sql优化的方法:

  • 最大化利用索引;
  • 尽可能避免全表扫描;
  • 减少无效数据的查询;?

sql执行顺序:

FROM<表名> # 选取表,将多个表数据通过笛卡尔积变成一个表。

ON<筛选条件> # 对笛卡尔积的虚表进行筛选

JOIN?<join, left join, right join...>

<join表> # 指定join,用于添加数据到on之后的虚表中,例如left join会将左表的剩余数据添加到虚表中

WHERE<where条件> # 对上述虚表进行筛选

GROUP BY<分组条件> # 分组

<SUM()等聚合函数> # 用于having子句进行判断,在书写上这类聚合函数是写在having判断里面的

HAVING<分组筛选> # 对分组后的结果进行聚合筛选

SELECT<返回数据列表> # 返回的单列必须在group by子句中,聚合函数除外

DISTINCT数据除重

ORDER BY<排序条件> # 排序

LIMIT<行数限制>

优化策略:

1、避免索引失效:

  • 不使用开头模糊查询,使用后模糊查询
  • 在索引列上使用mysql 的内置函数和表达式,索引失效。 Mysql5.7 不支持函数索引,Mysql8.0支持函数索引。
  • 使用MySQL内置函数INSTR(str,substr) 来替代前模糊查询
  • 避免使用innot in,连续值可使用between代替
  • 避免使用or,可使用union代替or
  • 避免进行NULL判断:... where table.col is NULL;可以添加默认值解决
  • where语句中使用<>,!=,not in,not like会导致索引失效
  • where条件仅包含符合索引的非前置列,例如复合索引包含a,b,c三列,有效索引为a|a,b|a,b,c
  • 隐式类型转换导致索引失效,如:字符串字段查询必须使用''号
  • order by中的条件要与where中的一致否则order by不会使用索引排序,同样group by也可以利用索引来提速

2、select语句优化:

  • 避免使用select *,select *会查询所有列,增加io操作,消耗内存和CPU
  • 避免使用不确定结果的函数:now(),current_user(),sysdate()
  • 多表联合查询:小表在前大表在后
  • 使用表的别名,把表明前缀到每个使用到的列上
  • 调整where字句中的链接顺序,mysql会从左到右,自上而下解析where字句。应将过滤数据多的条件往前放
  • 复杂查询可以使用中间临时表暂存数据
  • mysql中group by col1,col2,...会执行排序:order by col1,col2...。可以指定obder by NULL取消排序
  • 使用join语句代替子查询
  • 尽量使用union all,union会对临时表加上distinct选项,导致整个临时表做唯一性校验
  • 拆分大sql为多个小sql

3、增删改优化:

  • 大批量插入数据,使用一次性插入多条的语句替代一条条插入。

二、MySql分库分表

  • 分库:将原来一个数据库中的数据分别部署到不同的服务器上
  • 分表:将原来的一个表拆分成多个表
  • 为什么要分库分表:提高查询效率,提高并发量

1、分库方法:

  • 按照业务划分-垂直分库:

  • 垂直分库的问题:

无法保证事务的完整性

无法使用join语句

  • 水平分库:将数据存放在多个数据库,每个数据库的结构完全一样,不同范围内的数据存放在不同的数据库中

2、MySql分表:

  • 垂直分表:

????????

?将user表拆分成userbase表(左)和userinfo(右)

  • 水平分表:原来一个表中的数据存放在不同表中,不同范围内的数据存放在不同表中

三、MySql读写分离/主从复制/MySql集群

  • 原理:

?仅主库进行写操作,其他库可用来读操作,通过复制bin_log将数据从主库同步到各个分库。

  • 读写分离常用中间件

常用的读写分离中间件程序有以下种:
1、cobar
阿里B2B开发的关系型分布式系统,是一款早期的中间件,后来因开发者离职而无人维护。
2、MyCAT
技术爱好者在cobar的基础上进行了二次开发,解决了cobar的一些问题,并加入了一些新功能,目前MyCAT社区活跃度较高,也有很多公司在使用MyCAT。
3、OneProxy
Oneproxy是一款商业收费的中间件,由支付宝团队开发,在高并发场景下十分稳定。
4、Vitess
该中间件架构复杂,且使用Vitess需要使用其所提供的API接口。
5、Kingshard
由360团队开发,支持分库分表,但是在高并发情况下稳定性一般。
6、MaxScale和MySQL Route
这两者均为MySQL官方中间件。Maxscale是Mariadb研发的,MySQL Route是现在Oracle公司为MySQL数据库发布的中间件。

参考自:MySQL最全优化总结 - 知乎

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

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