数据库优化专题---10、存储优化

数据库优化专题—1、表的主键用数字还是UUID
数据库优化专题—2、逻辑删除还是物理删除
数据库优化专题—3、千万记录如何快速分页
数据库优化专题—4、读多写少和读多写多
数据库优化专题—5、删改数据如何避免锁表
数据库优化专题—6、如何避免偷换交易中的商品信息
数据库优化专题—7、SQL语句优化
数据库优化专题—8、Mysql参数优化
数据库优化专题—9、索引优化
数据库优化专题—10、存储优化
数据库优化专题—11、数据库结构优化

目录

    • 存储引擎介绍
      • InnoDB存储引擎
      • MyISAM存储引擎
      • MyISAM和Innodb区别
    • 存储优化
      • 禁用索引
      • 禁用唯一性检查
      • 禁用外键检查
      • 批量插入数据
      • 禁止自动提交
    • 总结

这节主要介绍下存储优化。

MySQL中索引是在存储引擎层实现的,这里我们会讲解存储引擎。
执行查询引擎的命令show engines,可以看到MySQL支持的存储引擎结果如下:
数据库优化专题---10、存储优化_第1张图片
mysql支持存储引擎有好几种,咱们这里主要讨论一下常用的Innodb,MyISAM存储引擎。

存储引擎介绍

InnoDB存储引擎

特点:

  1. InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。相比较 MyISAM存储引擎,InnoDB写的处理效率差一点并且会占用更多的磁盘空间保 留数据和索引;
  2. 提供了对数据库事务ACID(原子性Atomicity、一致性Consistency、隔离性 Isolation、持久性Durability)的支持,实现了SQL标准的四种隔离级别;
  3. 设计目标就是处理大容量的数据库系统,MySQL运行时InnoDB会在内存中建立 缓冲池,用于缓冲数据和索引;
  4. 执行“select count(*) from table”语句时需要扫描全表,因为使用innodb引擎的 表不会保存表的具体行数,所以需要扫描整个表才能计算多少行;
  5. InnoDB引擎是行锁,粒度更小,所以写操作不会锁定全表,在并发较高时,使用InnoDB会提升效率。即存在大量UPDATE/INSERT操作时,效率较高;
  6. InnoDB清空数据量大的表时,是非常缓慢,这是因为InnoDB必须处理表中的每一行,根据InnoDB的事务设计原则,首先需要把“删除动作”写入“事务日志”, 然后写入实际的表所以,清空大表的时候,好直接drop table然后重建。即 InnoDB一行一行删除,不会重建表。

使用场景:

  1. 经常UPDETE/INSERT的表,使用处理多并发的写请求;
  2. 支持事务,必选InnoDB;
  3. 可以从灾难中恢复(日志+事务回滚);
  4. 外键约束、列属性AUTO_INCREMENT支持。

MyISAM存储引擎

特点:

  1. MyISAM不支持事务,不支持外键,SELECT/INSERT为主的应用可以使用该引擎;
  2. 每个MyISAM在存储成3个文件,扩展名分别是:
    • 存储表定义(表结构等信息);
    • MYD(MYData),存储数据 3) MYI(MYIndex),存储索引;
  3. 不同MyISAM表的索引文件和数据文件可以放置到不同的路径下;
  4. MyISAM类型的表提供修复的工具,可以用CHECK TABLE语句来检查MyISAM表 健康,并用REPAIR TABLE语句修复一个损坏的MyISAM表;
  5. 在MySQL5.6以前,只有MyISAM支持Full-text全文索引。

使用场景:

  1. 经常SELECT/INSERT的表,插入不频繁,查询非常频繁 ;
  2. 不支持事务;
  3. 做很多count 的计算。

MyISAM和Innodb区别

InnoDB和MyISAM是许多人在使用MySQL时常用的两个存储引擎,这两个存储 引擎各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理,而 InnoDB类型支持。MyISAM类型强调的是性能,其执行速度比InnoDB类型更快,而 InnoDB提供事务支持已经外部键等高级数据库功能。

  • MyISAM是非事务安全型的,而InnoDB是事务安全型的;
  • MyISAM锁的粒度是表级,而InnoDB支持行级锁定。 MyISAM不支持外键,而InnoDB支持外键;
  • MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用 MyISAM ;
  • InnoDB表比MyISAM表更安全。

存储优化

禁用索引

对于使用索引的表,插入记录时,MySQL会对插入的记录建立索引。如果插入大量数据,建立索引会降低插入数据速度。为了解决这个问题,可以在批量插入数据之 前禁用索引,数据插入完成后再开启索引;

  • 禁用索引的语句: ALTER TABLE table_name DISABLE KEYS;
  • 开启索引语句: ALTER TABLE table_name ENABLE KEYS;

MyISAM对于空表批量插入数据,则不需要进行操作,因为MyISAM引擎的表是在导 入数据后才建立索引;

禁用唯一性检查

唯一性校验会降低插入记录的速度,可以在插入记录之前禁用唯一性检查,插入数据完成后再开启;

  • 禁用唯一性检查的语句:SET UNIQUE_CHECKS = 0;
  • 开启唯一性检查的语句:SET UNIQUE_CHECKS = 1;

禁用外键检查

插入数据之前执行禁止对外键的检查,数据插入完成后再恢复,可以提供插入速度
开启:SET foreign_key_checks = 1。

批量插入数据

插入数据时,可以使用一条INSERT语句插入一条数据,也可以插入多条数据
一个sql语句插入一条数据:
数据库优化专题---10、存储优化_第2张图片
一个失去了语句插入多条数据:
数据库优化专题---10、存储优化_第3张图片

禁止自动提交

插入数据之前执行禁止事务的自动提交,数据插入完成后再恢复,可以提高插入速度
禁用:SET autocommit = 0;
开启:SET autocommit = 1;

总结

禁用索引、批量插入等可以提升整体存储优化。

你可能感兴趣的:(数据库优化专题)