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性能优化(4):优化的注意事项 -> 正文阅读

[大数据]Mysql性能优化(4):优化的注意事项

1 适当使用索引

1.1 建立索引的原则

1. 较频繁的作为查询条件的字段应该创建索引,如:登录操作

2. 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件 作为索引的列,如果不能有效的区分数据,那么这个列就不适合作为索引列;比如(性别,状态不多的状态列)

3. 更新非常频繁的字段不适合创建索引,原因:索引有维护成本

4. 不会出现在where 子句中的字段不该创建索引

5. 索引不是越多越好;(只为必要的列创建索引)

1.2 join的原则

注意:不要使用隐式连接,原因在于SQL的执行顺序

1. 数据量小的表写在join的左边,数据量大的表写在join的右边

????????MySQL中join都是通过Nested Loop Join来实现,简单理解为循环嵌套,应该数据量少的表作为外层循环,数据量大的表作为内层循环,然后合并结果

2. 优先优化Nested Loop的内层循环

3. 保证join语句中被作为连接条件的字段已经建立了索引

4. 扩大缓冲区的大小,容纳更大的查询数据(在配置文件中配置,DBA来做)

例如:

有两张表,一张人员表,一张部门表,其中部门表

如果我们联查是写法如下:

select e.id,e.name,d.id,d.name from employee e join department d on e.dept_id = d.id

将大表放到左边,小表放到右边,那么在经过查询优化器时,查询优化器会对代码进行优化,将优化器进行,优化结果如下:

select e.id,e.name,d.id,d.name from department d join?employee e on e.dept_id = d.id

下面我们来分析原因:

? ? ? ? sql在执行的过程中,会先将join左边的表读取到内存中,然后将内存中数据的ID逐条通过I/O操作去读取硬盘中的数据进行匹配。

for(id:department){
     //id去使用IO匹配硬盘中的数据
     for(dept_id:employee){
          id = dept_id;
     }
}

所以左边的表越大,占用的内存和需要进行的I/O操作就越多,需要消耗的资源也就越多。

2 避免索引失效(忽略查询优化器)

1. where语句中索引列参与算术计算,该索引失效

2. where语句中索引列参与函数运算,该索引失效

3. where语句中使用in运算符有时会让索引失效

4. where语句中做不等于( != , <> )运行,该索引失效

5. where语句中发生类型转发,该索引失效(查询优化器会自动优化)

6. where语句中模糊查询时以%开头,该索引失效

7. 在复合索引的使用时跟声明时顺序不一致或者中间有列的缺失,该索引失效

????????如:声明了(a,b,c)的复合索引,但是在用是时候中间有列的缺失where a = xx and c = xx中间缺失了b,所以无法使用该复合索引,只要不是缺失中间列,其他情况索引均有效

3?不合理的需求优化

对于程序员来讲,代码写完了测试能运行通过了,没问题,就可以算是完成工作了,但是往往在该功能上线后没多久就突然间挂了,此时程序员都是一面懵逼,不知道为什么会挂掉,其实问题就出在程序员只知道到功能测试,不清楚除此之外还有其他的方面需要测,比如:压力测试,性能测试等等,当压力测试和性能测试不达标时就会凸显出一些问题,比如这个需求提出是否合理.是否有其他效果相同的替换方面

实时更新

该功能在社交系统中比较常见,如:点赞数量,评论等.这些内容真的是实时更新的吗?

在早期只有关系型数据库的年代,这些内容都不是实时更新的,比如我点赞了,评论了。

这些功能虽然表面上在UI界面上是显示出来了一个更新过的效果,但是你只要刷新下,你就会发现这些数据在UI界面中消失了,而隔天后再刷新,发现又有了,这是怎么回事?

我们可以试想下,一个比较火爆的应用中,不断的往数据库中加入数据,我们是不是需要使用查询语句才能把数据查询出来,如频繁的发送select count(1) from table这样的统计SQL是非常耗费性能的,再加上并发一高就要数据库就要挂,此时我们就应该重新的来看待,这样的功能真是必须做成实时的吗?

优化方案

????????1. 我们无非就是要显示一个点赞数,这个点赞的数量对功能的使用有影响吗?显然是没有的,那么就完全没有必要做成实时更新,我们可以在网页中显示一个大概的数,然后每隔一段时间更新1次即可

????????2. 单独使用一张表来存储统计数量的,一旦数据有变动,就直接在独立的表中操作,最后也就只要在独立的表中

查询出统计好的数据即可类似的这些不合理的需求还有:实时统计网站的在线人数,分页的总页数,借贷平台的实时显示总借贷金额等等,基本上这些不合理的需求耗费了整个系统85%的性能,也是直接导致数据库崩溃的直接原因之一,所以一般产品经理在设计互联网产品功能的时候都需要有懂技术的团队来评估下该需求是否合理

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 10:00:40  更:2022-05-14 10:01:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/16 5:41:32-

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