视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL存储引擎InnoDB的配置与使用的讲解
2020-11-09 21:16:17 责编:小采
文档

MyISAM和InnoDB是MySQL最常有的存储引擎,上一篇我们讲述了InnoDB与MyISAM之间的区别;由于MyISAM不支持事务,当我们需要使用一个健壮的事务型存储引擎的时候,InnoDB必然是最好的选择。

innodb 通过多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲(insert buffer)、二次读写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

如何设置InnoDB为默认引擎:

  • 1. 查看mysql存储引擎情况: mysql>show engines。 InnoDB | YES,说明此mysql数据库服务器支持InnoDB引擎。
  • 2. 设置InnoDB为默认引擎:在配置文件my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB
  • 3. 重启mysql服务器
  • 4. 登录mysql数据库,mysql>show engines。如果出现 InnoDB |DEFAULT,则表示设置InnoDB为默认引擎成功。
  • InnoDB常用配置参数:

    #InnoDB存储数据字典、内部数据结构的缓冲池,16MB 已经足够大了。
    innodb_additional_mem_pool_size = 16M
    #InnoDB用于缓存数据、索引、锁、插入缓冲、数据字典等
    #如果是专用的DB服务器,且以InnoDB引擎为主的场景,通常可设置物理内存的50%
    #如果是非专用DB服务器,可以先尝试设置成内存的1/4,如果有问题再调整
    #默认值是8M,非常坑X,这也是导致很多人觉得InnoDB不如MyISAM好用的缘故
    innodb_buffer_pool_size = 4G
    #InnoDB共享表空间初始化大小,默认是 10MB,也非常坑X,改成 1GB,并且自动扩展
    innodb_data_file_path = ibdata1:1G:autoextend
    #如果不了解本选项,建议设置为1,能较好保护数据可靠性,对性能有一定影响,但可控
    innodb_flush_log_at_trx_commit = 1
    #InnoDB的log buffer,通常设置为 MB 就足够了
    innodb_log_buffer_size = M
    #InnoDB redo log大小,通常设置256MB 就足够了
    innodb_log_file_size = 256M
    #InnoDB redo log文件组,通常设置为 2 就足够了
    innodb_log_files_in_group = 2
    #启用InnoDB的表空间模式,便于管理
    innodb_file_per_table = 1
    #启用InnoDB的status file,便于管理员查看以及监控等
    innodb_status_file = 1
    #设置事务隔离级别为 READ-COMMITED,提高事务效率,通常都满足事务一致性要求
    transaction_isolation = READ-COMMITTED 
    其他配置选项也需要注意:
    #设置最大并发连接数,如果前端程序是PHP,可适当加大,但不可过大
    #如果前端程序采用连接池,可适当调小,避免连接数过大
    max_connections = 60
    #最大连接错误次数,可适当加大,防止频繁连接错误后,前端host被mysql拒绝掉
    max_connect_errors = 100000
    #设置慢查询阀值,建议设置最小的 1 秒
    long_query_time = 1
    #设置临时表最大值,这是每次连接都会分配,不宜设置过大 max_heap_table_size 和 tmp_table_size 要设置一样大
    max_heap_table_size = 96M
    tmp_table_size = 96M
    #每个连接都会分配的一些排序、连接等缓冲,一般设置为 2MB 就足够了
    sort_buffer_size = 2M
    join_buffer_size = 2M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    #建议关闭query cache,有些时候对性能反而是一种损害
    query_cache_size = 0
    #如果是以InnoDB引擎为主的DB,专用于MyISAM引擎的 key_buffer_size 可以设置较小,8MB 已足够
    #如果是以MyISAM引擎为主,可设置较大,但不能超过4G
    #在这里,强烈建议不使用MyISAM引擎,默认都是用InnoDB引擎
    key_buffer_size = 8M
    #设置连接超时阀值,如果前端程序采用短连接,建议缩短这2个值
    #如果前端程序采用长连接,可直接注释掉这两个选项,是用默认配置(8小时)
    interactive_timeout = 120
    wait_timeout = 120

    几个关于InnoDB引擎数据表设计相关的建议:

  • 1. 所有InnoDB数据表都创建一个和业务无关的自增数字型作为主键,对保证性能很有帮助;
  • 2. 杜绝使用text/blob,确实需要使用的,尽可能拆分出去成一个的表;
  • 3. 时间戳建议使用 TIMESTAMP 类型存储;
  • 4. IPV4 地址建议用 INT UNSIGNED 类型存储;
  • 5. 性别等非是即非的逻辑,建议采用 TINYINT 存储,而不是 CHAR(1);
  • 6. 存储较长文本内容时,建议采用JSON/BSON格式存储;
  • InnoDB锁类型

    InnoDB存储引擎实现如下两种标准的行级锁

  • 共享锁(S Lock), 允许事务读一行数据
  • 排他锁(X Lock),允许事务删除或更新一行数据
  • 共享锁和排他锁的兼容

    注意:

    (1)S锁和X锁都是行锁,兼容是指对同一记录(row)锁的兼容性.

    (2)事务T1已经获得行R的共享锁,另一个事务T2可以立即获得行R的共享锁,这种情况称为锁兼容。事务T3想获得行R的排他锁,则必须等待事务T1、T2释放行R上的共享锁,这种情况成为锁的不兼容.

    总结

    下载本文
    显示全文
    专题