背景图

数据库与高并发

现在数据库的使用已经非常广泛,但是频繁的数据库操作会造成一定的性能瓶颈,那么怎么提升数据库的访问速度呢。下面我们来简单聊一下,数据库层的优化问题。

使用索引

数据库最重要的优化就是使用索引了,其次就是选择使用不同的数据引擎。另外记住order by的作用会影响系统的性能。最好把order by的字段也加入索引之中。另外不要觉得二级索引不会走到,只是会慢一些罢了。

还有很多人会忽略的一点,索引只能走一个,索引他们会想办法走主索引后再想法去走另一个索引,但是你这样写之后也许SQL不会走主索引了,走了另一个索引了。所以复杂条件的SQL会走的索引是不可知的。这个时候我们需要使用explain查看SQL的执行计划。

另外很重要的一点,SQL耗时长也可能是存在数据库锁的原因。而导致锁存在的原因,一是自己加锁,还有一种可能就是大事务。

其他优化

利用limit语句和offset进行数据的快速定位处理,在消单的时候特别有用。

尽量利用插入顺序进行文件的读取,否则就需要通过索引或者缓存缓冲进行相应的处理了。

利用缓存代替锁

现在数据库锁也是经常使用,所以我们也需要使用预定的功能进行实现。比如利用数据生成序列号的时候,我们都是一次生成1000个号,这样的做得原因是单机使用时不需要再次去获取,即可达到唯一性的要求。缺点就是重启后就会导致号不连续,也保证生成的序列号使用时是递增的。但是对于性能提升有很大的帮助作用。因为减少了大量的数据锁访问。

大事务

定义

定义:运行时间比较长,操作的数据比较多的事务。

大事务风险:

  1. 锁定太多的数据,造成大量的阻塞和锁超时,回滚所需要的时间比较长。
  2. 执行时间长,容易造成主从延迟。

如何处理大事务:

  1. 避免一次处理太多大数据。
  2. 移出不必要在事务中的select操作
  3. 不要在事务中访问网络

大表

当然如果表中的数据太多也会带来访问变慢的问题。

大表定义:单表超过千万行、文件超过10G

大表对查询的影响:

  1. 慢查询
  2. 区分度底
  3. 大量磁盘IO
  4. 建立索引需要很长的时间
  5. 修改表结构需要长时间锁表
  6. 影响正常的数据操作

如何处理大表问题:

  1. 分库分表把一张表分成多个小表。难点:分表主键的选择、分表后夸分区数据的查询和统计。热度热写、动态扩表
  2. 大表的历史数据归档(前端增加历史查询)难点:时间点选择,如何进行归档操作

也许是分表分库和历史数据归档进行一起使用。

高并发的数据库服务器

主要是CPU与磁盘IO以及内存,数据库的内存一般都很大,20G是最低的要求,高的可达40-50G的内存,多集群并发计算。

关于数据库服务器有以下几点:

  1. 数据库架构:主从复制、读写分离、集群等。
  2. TPS:每秒处理事务的速度(一个事务三个过程)。a)用户请求服务器、b)服务器内部处理、c)服务器返回给用户。
  3. QPS:是一台指定服务器每秒能够相应的查询次数。
  4. 并发量:同一时间处理的请求的数量。
  5. 连接数:和服务器进行连接,但大部分处于sleep状态,只有少部分在运行。
  6. 并发量大,连接数大说明cpu空闲少繁忙。
  7. 磁盘IO读写过高会对服务器性能能造成影响。
  8. 不要在主库上数据库备份(磁盘读压力增大)。

缓存

当然最重要的就是缓存,缓存的方式多种多样,比如业务缓存、建立临时表、使用离线数据处理能力、将线上数据转线下处理(不过这种应该叫做缓冲)、NoSQL数据库,冗余数据处理等。

页面静态缓存等。

缓冲

这个就是上面讲到的临时表、线上数据转线下处理、多备份、NoSQL、文件处理等。

请求拆解

将业务请求拆解也能获取一定的高性能处理。

总结

数据库优化分为两个部分:业务优化+标准优化:

标准优化是指正常的优化思路,例如索引、分表分库等。

业务优化,是指具体问题具体分析,多想多思,你总能从业务优化上获取一定的性能提升,比如按插入顺序limit、多维度处理、页面静态化处理等。

0%