mysql 优化学习一

影响数据库的因素

  1. 服务器硬件性能
  2. 磁盘IO
  3. sql查询速度
  4. 网卡流量
QPS: 每秒钟处理的查询量
TPS: 每秒钟处理的事务数
并发量:同一时刻所需要数据服务器做处理的请求的数量
连接量:往往要比并发量大得多,是客户端与数据库服务器建立的链接数量

超高的QPS 和 TPS

10ms 处理一个sql => 1s 处理 100个sql => QPS => 100
100ms处理一个sql => 1s 处理 10 个sql => QPS => 10

数据库性能 80%是由于慢查询引起的,即大部分的数据库性能问题可以通过sql优化来解决。

大量的并发和超高的CPU使用率所带来的风险

  1. 大量的并发:数据库连接数被沾满(max_connection默认100)
  2. 超高的CPU使用率:因CPU资源耗尽而出现宕机

磁盘IO

数据库的只要瓶颈

  1. 磁盘IO性能突然下降(热数据远远大于服务器可用内存=>使用更快的磁盘设备)
  2. 其他大量的消耗磁盘性能的计划任务(调整计划任务、做好磁盘维护)

网卡流量

  • 网卡IO被沾满(1000Mb/8 ≈ 100MB)
    1. 减少从服务器的数量
    2. 进行分级缓存
    3. 避免使用select * 进行查询
    4. 分离业务网络和服务器网络

大表带来的问题

什么是大表:

1. 记录行数巨大,单表超过千万行
2. 表数据文件巨大,表数据文件超过10G

大表对查询的影响:

慢查询:很难再一定的时间内过滤出所需的数据

大表对DDL的影响:

1. 建立索引需要很长的时间
    1). Mysql版本<5.5 建立索引会锁表
    2). Mysql版本>=5.5 虽然不会锁表,但会引起主从延迟
2. 修改表结构需要长时间锁表
    1). 会造成长时间的主从延迟
    2). 影响正常的数据操作(会阻塞)

如何处理数据库中的大表问题

  1. 分库分表把一张大表分成多个小表

    难点:
        分表主键的选择
        分表后跨分区数据的查询和统计
    
  2. 大表的历史数据归档(减少对前后端业务的影响)

    难点:
        归档时间点的选择
        如何进行归档操作
    

大事务带来的问题

1. 事务是数据库系统区别与其他一切文件系统的重要特性之一
2. 事务是一组具有原子性的sql语句,或是一个独立执行的单元
3. 事务需要符合的四大特性:①原子性(ATOMICITY) ②一致性 (CONSISTENCY)③ 隔离性 (ISOLATION)④持久性
定义:一个事务必须是一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作

事务原子性(ATOMICITY):整个事务要么全部提交成功,要么全部失败回滚
事务一致性(CONSISTENCY):一致性是指将数据库从一种一致性状态转换到另一种一致性状态,在事务开始之前和事务结束后数据库中数据的完整性没有被破坏
事务隔离性(ISOLATION):隔离性要求一个事务对数据库中数据的修改,在未提交完成前对于其他事务是不可见的
SQL标准中定义了四中隔离级别:(隔离性由低到高,并发性有高到低)
1. 未提交读(READ UNCOMMITED),会产生脏读
2. 已提交读(READ COMMITTED)
3. 可重复读(REPEATABLE READ)
4. 可串行化(SERIALIZABLE)

事务持久性(DURABILITY):一旦事务提交,则其所做的修改就会永久保存到数据库中,此时系统崩溃,已提交的修改数据也不会丢失。

mysql查看隔离级别:show variables like '%iso%';

mysql修改隔离级别:(可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.)
    ①修改mysql.ini:
        [mysqld]
        transaction-isolation = REPEATABLE-READ
    ②客户端修改:
        SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]

innodb默认的隔离级别是可重复度(REPEATABLE READ)

所谓的大事务就是:运行时间比较长,操作数据比较多的事务
问题:
1. 锁定太多的数据,造成大量的阻塞和锁超时
2. 回滚需要的时间比较长,会锁定回滚所需要的行,所需时间甚至比修改所需时间还要长。
3. 执行时间长,容易造成主从延迟

如何处理大事务:
1. 避免一次处理提多的数据
2. 移出不必要在事务中的SELECT操作

你可能感兴趣的:(mysql,sql优化)