vlambda博客
学习文章列表

下次面试官问你数据库优化,你就这么怼回去!!!!!!!

   


    数据库优化不管是在面试还是工作当中都是不可缺少的技能,首先数据库优化又分软件优化,硬件优化,架构优化。

目录

  • 软件优化

    • 正确使用MyISAM和InnoDB存储引擎

    • 正确使用索引

    • 避免使用select *

    • 字段尽可能设置为NOT NULL

    • SQL慢查询分析

    • EXPLAIN性能分析

  • 硬件优化

    •  增加物理内存

    •  增加应用缓存

    •  用固态硬盘代替机械硬盘

  • 架构优化

    • 分表

    • 分库    

    • 读写分离

    • 活跃数据分离





  • 正确使用MyISAM和InnoDB存储引擎

    • MyISAM基于ISAM (索引顺序访问方法),支持全文索引,但并非是事务安全,不支持外键,使用表级锁。每个MyISAM表存有3个文件: FRM文件存放表结构,MYD文件存数据,MYI存放索引。

    • InnoDB是事务型存储引擎,其支持行锁,InnoDB 表的行锁也不是绝对的,如果它在执一个更新的语句时没法确定更新的范围,也会锁表,例如执行语句update table set age= 3 where name like *%jeff%o",在这个更新语句就会锁表。InnoDB 支持回滚、崩溃恢复、ACID 事务控noDB存储它的表和索引在一张表空间,表空间可以包含多个文件.


    • 下次面试官问你数据库优化,你就这么怼回去!!!!!!!

  • 正确使用索引

    • 在经常使用在 WHERE 子句中的列上面创建索引,加快条件的判断速度。

    • 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询 时间

    • 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度.

    • 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件;

    • 表记录太少,经常增删改的表,数据重复且分布平均的字段不需要创建索引;

  • 避免使用select *

    • “select *”从数据库中返回的结果更多,降低了查询的速度。.过多的返回结果会增大服务器返回给前端的数据的传输量。非常影响性能过大的传输量很容易造成请求的失效。

  • 字段尽可能设置为NOT NULL

    • 不要以为null值不需要空间,其实null值是需要占用额外的空间的,并且在查询比较的时候,程序会得更复杂。null值给程序带来了额外的开发成本。例如,字符串的字段允许null值,那就意味着程序员要处理字符串类型为空和null两种情况,客户端程序员的工作量就大了。

  • SQL慢查询分析

    • SQL慢查询是指执行超过一定时间的SQL查询语句,把这些SQL语句记录到慢查询日志,方便开发人员找出有性能问题的SQL,针对这些SQL语句进行分析调优。

  • EXPLAIN性能分析

    • 使用EXPLAIN关键字,可以查看SQL的执行顺序,是否用到索引,是否用到临时表等信息,以便来调整我们的SQL.


    • 下次面试官问你数据库优化,你就这么怼回去!!!!!!!

  • 增加物理内存

    • MySQL读写数据最大的性能瓶颈就是磁盘IO,从减少磁盘IO方面提高性能是个重要的方向。通过加大物理内存可以采取提升文件系统性能,减少磁盘 IO.Linux内核在内存中开辟了缓存(系统缓存和应用缓存)来存放数据。.当写文件的时候,通过文件延迟写入机制,先把文件保存在缓存,(缓存达到多少的百分比或者接到了sync) ,才真正写入硬盘。当读文件的时候,会把读出的文件放入缓存当下次需要读取同样的文件时:缓存中取,如果缓存没有,再从硬盘中读取。

  •  增加应用缓存

    • 本地缓存:把数据放在服务器的内存或文件中。

    • 分布式缓存:通过redis或memcache可以缓存海量数据。

  • 用固态硬盘代替机械硬盘

    • 固态硬盘称为SSD硬盘,有点像平时的U盘,只是电路板更复杂,没有像机械硬盘那样的马达及存储碟盘,主要以半导体固体作为数据存储介质。其优点是速度快、稳定、寿命长,但价格比较高。

    • 传统的硬盘中数据是存储在盘片,通过磁头移动和盘片转动的操作读取数据,但这造成了磁盘读写速度慢,越是不连续的文件,读写速度就越慢。对不连续的文件进行读写的操作称之为随机读写,实际上在日常使用中绝大多数硬盘读写操作都是随机类型,而SSD与传统硬盘的最大差异就在于随机读写速度,这就是由SSD的基本构造决定的。

    • SSD硬盘最主要改变了数据存储和读取的方式,SSD硬盘中数据存储在闪存芯片中,其是一种非 易失性内存芯片,通过充电、放电的方式写入和擦除数据,速度相当快。读写操作中通过电路传输信号,因此也不会有传统硬盘的移动磁头和转动磁盘等操作,大大减少了处理时间。

    • 机械硬盘的读取速度大概在100MB/s 左右,而一般的SSD读取速度可达400MB/s甚至600MB/s以上,有些专业的SSD读取速度可达4000MB/s。  

  • 分表

    • 当项目上线后,随着用户的增长,有些数据表的规模会以TB增长,当数据达到一定规模后查询读取性能就下降很多,这时开发人员就要考虑分表。更新表数据时会更新索引,当单表数据量很大时这个过程比较耗时,这就是为什么对大表进行写操作会比较慢的原因,并且更新表数据会引起表锁或者行锁,这也会导致其他操作等待。
      如果将大表拆分为多个子表,那么在更新或者查询数据的时候,压力会分散到不同的表上。由于分表之后每张表的数据较小,不管是查询还是更新的提高都得到极大的提升,即使出现最环的“锁表”的情况,其他表还是可以继续使用。

  • 分库

    • 数据库垂直拆分 指的是按照业务对数据库中的表进行分组,同组的放到一个新的数据库(逻辑上,并非实例)中。需要从实际业务出发将大业务分割成小业务。比如商城的整个业务中的 用户相关表,订单相关表,物流相关表 各自独立分类形成 用户系统数据库,订单系统数据库,物流系统数据库。

      下次面试官问你数据库优化,你就这么怼回去!!!!!!!

      下次面试官问你数据库优化,你就这么怼回去!!!!!!!

  • 读写分离
    • 大多数互联网数据操作往往都是读多写少,随着数据的增长,数据库的 “读” 会首先成为瓶颈。如果我们希望能线性地提升数据库的读性能和写性能,就需要让读写尽可能的不相互影响,各自为政。在使用读写分离之前我们应该考虑使用缓存能不能解决问题。然后再考虑对数据库按照 “读” 和 “写” 进行分组

  • 活跃数据分离

    • 一个数据量很大的表,只有一小部分数据是活跃数据,经常被查询,更多的数据则是惰性数据,偶尔被调用一下。那么我们可以用2个表来保存,第一个表是活跃数据保存,第二个表是惰性数据保存。这样子可以有效提高效率。



万水千山总是情,点个 “好看” 行不行!!!