MySQL性能及架构设计:什么影响了数据库查询速度与MySQL性能( 三 )

  • 表级锁通常是在服务器层实现的 。
  • 行级锁是存储引擎层实现的 。innodb的锁机制 , 服务器层是不知道的
  • 2.5.4 阻塞和死锁
    (1)阻塞是由于资源不足引起的排队等待现象 。
    (2)死锁是由于两个对象在拥有一份资源的情况下申请另一份资源 , 而另一份资源恰好又是这两对象正持有的 , 导致两对象无法完成操作 , 且所持资源无法释放 。
    2.6 如何选择正确的存储引擎
    参考条件:
    1. 事务
    2. 备份(Innobd免费在线备份)
    3. 崩溃恢复
    4. 存储引擎的特有特性
    总结:Innodb大法好 。
    注意:尽量别使用混合存储引擎 , 比如回滚会出问题在线热备问题 。
    2.7 配置参数
    2.7.1 内存配置相关参数
    确定可以使用的内存上限 。
    内存的使用上限不能超过物理内存 , 否则容易造成内存溢出;(对于32位操作系统 , MySQL只能试用3G以下的内存 。)
    确定MySQL的每个连接单独使用的内存 。
    sort_buffer_size #定义了每个线程排序缓存区的大小 , MySQL在有查询、需要做排序操作时才会为每个缓冲区分配内存(直接分配该参数的全部内存);join_buffer_size #定义了每个线程所使用的连接缓冲区的大小 , 如果一个查询关联了多张表 , MySQL会为每张表分配一个连接缓冲 , 导致一个查询产生了多个连接缓冲;read_buffer_size #定义了当对一张MyISAM进行全表扫描时所分配读缓冲池大小 , MySQL有查询需要时会为其分配内存 , 其必须是4k的倍数;read_rnd_buffer_size #索引缓冲区大小 , MySQL有查询需要时会为其分配内存 , 只会分配需要的大小 。注意:以上四个参数是为一个线程分配的 , 如果有100个连接 , 那么需要×100 。
    MySQL数据库实例:
    ①MySQL是单进程多线程(而oracle是多进程) , 也就是说MySQL实例在系统上表现就是一个服务进程 , 即进程;
    ②MySQL实例是线程和内存组成 , 实例才是真正用于操作数据库文件的;
    一般情况下一个实例操作一个或多个数据库;集群情况下多个实例操作一个或多个数据库 。
    如何为缓存池分配内存:
    Innodb_buffer_pool_size , 定义了Innodb所使用缓存池的大小 , 对其性能十分重要 , 必须足够大 , 但是过大时 , 使得Innodb 关闭时候需要更多时间把脏页从缓冲池中刷新到磁盘中;
    总内存-(每个线程所需要的内存*连接数)-系统保留内存key_buffer_size , 定义了MyISAM所使用的缓存池的大小 , 由于数据是依赖存储操作系统缓存的 , 所以要为操作系统预留更大的内存空间;
    select sum(index_length) from information_schema.talbes where engine='myisam'注意:即使开发使用的表全部是Innodb表 , 也要为MyISAM预留内存 , 因为MySQL系统使用的表仍然是MyISAM表 。
    max_connections 控制允许的最大连接数 ,  一般2000更大 。
    不要使用外键约束保证数据的完整性 。
    2.8 性能优化顺序
    从上到下:
    MySQL性能及架构设计:什么影响了数据库查询速度与MySQL性能

    文章插图
     
    文章来源于:segmentFault
    作者:唐成勇
     




    推荐阅读