`
annan211
  • 浏览: 445503 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MyISAM存储引擎的优化

阅读更多



   MyISAM存储引擎的优化
作为mysql最流行最古老的存储引擎之一的MyISAM,其在以读为主的非事务性系统中的优异表现成为多数程序员的首选。
   MyISAM 存储引擎的缓存策略是其和很多其他数据库乃至mysql其他的存储引擎都不一样,MyISAM只缓存索引而不会缓存数据。
MyISAM的索引和数据是分别存储在 ".MYI" 文件中的,索引和数据是分别以 cache block 和file block 的形式组织存放的,但实际上这两种数据都是以
file block 存放在磁盘上的。在一条query中通过索引查找数据会先检索索引缓存是否存在,不存在的话再去 MYI文件中查找数据,之后缓存到
key cache 。
  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
  分析几个与MyISAM索引缓存相关的几个系统参数。
  1 key buffer size 索引缓存大小
    在32位机上不要超过2GB,在64位机上不要超过4GB。
  2 key_buffer_block_size 索引缓存中的cache block size
    在key cache中的所有数据都是以cache block 形式存在的。这个参数就是设置每个cache block的大小。
  3 key_cache_division_limit LRU链表中的hot area和warm area 分解值。
    热数据和冷数据的分解值,设置范围为0-100 系统默认为100,也就是只有冷数据。参数值为冷数据占整个数据的百分比。
  4 key_cache_age_threshold 控制cache block从热数据降到冷数据的限制。
    系统默认值300 最小可设置100 ,值越小,被降级的可能性越大。

  通过以上几个参数的设置,基本上可以完成MyISAM整体优化的70%的工作,但是如何优化参数,并不是一个简单的事情。
  如果需要详细了解这几个参数的特性 可以参考mysql官方文档和 <Mysql性能调优与架构设计> 中的第十一章。
 
  对于key_buffer_size的设置我们一般通过三个指标来计算。1 系统索引的大小,2 系统可用的物理内存,3 系统当前的key cache 命中率。
  我们可以通过Mysql官方手册提供的计算公式来粗略计算。
  key_size = key_number * (key_length + 4) /0.67
  Max_key_buffer_size < Max_ram - QCache_Usage - Threads_Usage-System_Useage
 
  Threads_Usage = max_connections * (sort_buffer_size + join_buffer_size + read_buffer_size + read_rnd_buffer_size + thread_stack)
 
  当然,考虑到活跃数据的问题,我们并不需要将key_buffer_size 设置到可以将所有的索引都放下
的大小,这时候我们就需要Key Cache 的命中率数据来帮忙了。下面我们再来看一下系统中记录的与Key
Cache 相关的性能状态参数变量。
◆ Key_blocks_not_flushed,已经更改但还未刷新到磁盘的Dirty Cache Block;
◆ Key_blocks_unused,目前未被使用的Cache Block 数目;
◆ Key_blocks_used,已经使用了的Cache Block 数目;
◆ Key_read_requests,Cache Block 被请求读取的总次数;
◆ Key_reads,在Cache Block 中找不到需要读取的Key 信息后到“.MYI”文件中读取的次数;
◆ Key_write_requests,Cache Block 被请求修改的总次数;
◆ Key_writes,在Cache Block 中找不到需要修改的Key 信息后到“.MYI”文件中读入再修改的次
数;
由于上面各个状态参数在MySQL 官方文档中都有较为详细的描述,所以上面仅做基本的说明。当我
们的系统上线之后,我们就可以通过上面这些状态参数的状态值得到系统当前的Key Cache 使用的详细
情况和性能状态。
Key_buffer_UsageRatio = (1 - Key_blocks_used/(Key_blocks_used + Key_blocks_unused)) *
100%
Key_Buffer_Read_HitRatio = (1 - Key_reads/Key_read_requests) * 100%
Key_Buffer_Write_HitRatio = (1 - Key_writes/Key_Write_requests) * 100%
通过上面的这三个比率数据,就可以很清楚的知道我们的Key Cache 设置是否合理,尤其是
Key_Buffer_Read_HitRatio 参数和Key_buffer_UsageRatio 这两个比率。一般来说
Key_buffer_UsageRatio 应该在99%以上甚至100%,如果该值过低,则说明我们的key_buffer_size 设置
过大,MySQL 根本使用不完。Key_Buffer_Read_HitRatio 也应该尽可能的高。如果该值较低,则很有可
能是我们的key_buffer_size 设置过小, 需要适当增加key_buffer_size 值, 也有可能是
key_cache_age_threshold和key_cache_division_limit的设置不当,造成Key Cache cache失效太快。
一般来说,在实际应用场景中,很少有人调整key_cache_age_threshold 和key_cache_division_limit
这两个参数的值,大都是使用系统的默认值。

多Key Cache 的使用
从MySQL4.1.1 版本开始,MyISAM 开始支持多个Key Cache 并存的的功能。也就是说我们可以根据不
同的需要设置多个Key Cache 了,如将使用非常频繁而且基本不会被更新的表放入一个Key Cache 中以
防止在公共Key Cache 中被清除出去,而那些使用并不是很频繁而且可能会经常被更新的Key 放入另外一
个Key Cache 中。这样就可以避免出现某些场景下大批量的Key 被读入Key Cache 的时候,因为Key
Cache 空间问题使本来命中率很高的Key 也不得不被清除出去。
MySQL 官方建议在比较繁忙的系统上一般可以设置三个Key Cache:
一个Hot Cache 使用20%的大小用来存放使用非常频繁且更新很少的表的索引;
一个Cold Cache 使用20%的大小用来存放更新很频繁的表的索引;
一个Warm Cache 使用剩下的60%空间,作为整个系统默认的Key Cache;

  请尊重知识,请尊重原创 更多资料参考请见  http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
NULL 值对统计信息的影响
虽然都是使用B-Tree 索引,但是MyISAM 索引和Oracle 索引的处理方式不太一样,MyISAM 的索引中
是会记录值为NULL 的列信息的,只不过NULL 值的索引键占用的空间非常少。所以,NULL 值的处理方式
可能会影响到MySQL 的查询优化器对执行计划的选择。所以MySQL 就给我们提供了myisam_stats_method
这个参数让我们可以自行决定对索引中的NULL 值的处理方式。
myisam_stats_method 参数的作用就是让我们告诉MyISAM 在收集统计信息的时候,是认为所有NULL
值都是等同还是认为每个NULL 值都认为是完全不相等的值,所以其可设置的值也为nulls_unequal 和
nulls_equal。
当我们设置myisam_stats_method = nulls_unequal,MyISAM 在搜集统计信息的时候会认为每个
NULL 值都不同,则基于该字段的索引的Cardinality 就会更大,也就是说MyISAM 会认为DISTINCT 值数
量更多,这样就会让查询优化器处理Query 的时候使用该索引的倾向性更高。
而当我们设置myisam_stats_method = nulls_equal 之后,MyISAM 搜集统计信息的时候则会认为每
个NULL 值的都是一样的,这样Cardinality 数值会降低,优化器选择执行计划的时候放弃该索引的倾向
性会更高。
当然,上面所说的都是相对于使用等值查询的时候,而且NULL 值占比较大的情况下,如果我们的
NULL 值本身就很少,那不管我们是使用nulls_unequal 还是nulls_equal,对优化器选择执行计划的影响
是很小很小的。

MyISAM 并发优化
    MyISAM在查询方面的并发没有多大问题,而且性能非常高。但是由于MyISAM存储引擎的表级锁定以及读写互斥的问题,其并发写一直是个问题。
我们能做的也只有下面几点:
1 打开concurrent_insert,设置值为2,告诉MyISAM在尾部并行插入,使insert和select互不干扰。
2 控制写入操作的大小。
3 提高写入的优先级

其他可以优化的地方
除了上面我们分析的这几个方面之外,MyISAM 实际上还存在其他一些可以优化的地方和一些常用的
优化技巧。
1. 通过OPTIMIZE 命令来整理MyISAM 表的文件。这就像我们使用Windows 操作系统会每过一段时间
后都会做一次磁盘碎片整理,让系统中的文件尽量使用连续空间,提高文件的访问速度。MyISAM 在
通过OPTIMIZE 优化整理的时候,主要也是将因为数据删除和更新造成的碎片空间清理,使整个文件
连续在一起。一般来说,在每次做了较大的数据删除操作之后都需要做一次OPTIMIZE 操作。而且每
个季度都应该有一次OPTIMIZE 的维护操作。
2. 设置myisam_max_[extra]_sort_file_size 足够大,对REPAIR TABLE 的效率可能会有较大改
善。
3. 在执行CREATE INDEX 或者REPAIR TABLE 等需要大的排序操作的之前可以通过调整session 级
别的myisam_sort_buffer_size 参数值来提高排序操作的效率。
4. 通过打开delay_key_write 功能,减少IO 同步的操作,提高写入性能。
5. 通过调整bulk_insert_buffer_size 来提高INSERT...SELECT...这样的bulk insert 操作的整
体性能,LOAD DATA INFILE...的性能也可以得到改善。当然,在设置此参数的时候,也不应该一味
的追求很大,很多时候过渡追求极端反而会影响系统整体性能,毕竟系统性能是从整体来看的,而
不能仅仅针对某一个或者某一类操作。














 

分享到:
评论

相关推荐

    mysql常用配置参数和状态变量

    mysql常用配置参数和状态变量 一、 常用参数优化 二、 MyISAM存储引擎优化 三、 InnoDB存储引擎优化

    MySQL5.1性能调优与架构设计.mobi

    11.1 MyISAM存储引擎优化 11.2 InnoDB存储引擎优化 11.3 小结 第3篇 架构设计篇 第12章 MySQL可扩展设计的基本原则 12.0 引言 12.1 什么是可扩展性 12.2 事务相关性最小化原则 12.3 数据一致性原则 12.4 ...

    MySQL数据库MyISAM存储引擎转为Innodb的方法

    mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb。步骤如下:1、导出CentOS数据库的...

    Mysql 的存储引擎,myisam和innodb的区别

    MyISAM 是非事务的存储引擎。  innodb是支持事务的存储引擎。    innodb的引擎比较适合于插入和更新操作比较多的应用  而MyISAM 则适合用于频繁查询的应用    MyISAM –表锁。  innodb–设计合理的话是行锁。...

    MySQL MyISAM默认存储引擎实现原理

    默认MyISAM的表会在磁盘中产生3个文件:.frm(表结构文件)、.MYD(数据文件)、.MYI(索引文件)  可以在创建的时候指定数据文件和索引文件的存储... MyISAM引擎的存储格式: 定长(FIXED 静态) :是指字段不包含VA

    Mysql更换MyISAM存储引擎为Innodb的操作记录总结

    一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件。 通过下面的命令结果可知,已经安装了innodb插件。 mysql&gt; show plugins; +------------+--------+------------...

    MySQL存储引擎MyISAM与InnoDB的9点区别

    虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是它俩了。可能有站长并未注意过MySQL的存储引擎,其实存储引擎也是数据库设计里的一大重要点,那么博客系统应该使用哪种存储引擎呢?下面我们分别来看...

    MySQL存储引擎,Innodb与MyISAM谁更叼?

    MySQL存储引擎,Innodb与MyISAM谁更叼? 固定套路,问mysql数据库知识的时候,一定会带着问存储引擎,innodb,MyISAM,他们最主要的区别是索引的实现方式,然后是加锁粒度等等的区别,最后还会来到送命题你觉得选择...

    Mysql存储引擎详解

    存储引擎的介绍 关系型数据库表是用来存储和组织信息的数据结构,可以将表理解为由行和列组成的表格。 由于表的类型不同,我们在实际开发过程中,就有可能需要各种各样的表,不同的表就意味着存储不同类型的数据,...

    常见的mysql面试题

    2、解释一下InnoDB存储引擎中B+树索引的工作方式以及与MyISAM存储引擎的差异。 3、解释什么是覆盖索引,以及它在查询优化中的重要作用。 4、能否解释一下MySQL查询执行的步骤? 5、为什么我们在MySQL中需要索引? 6...

    MySQL存储引擎中MyISAM和InnoDB区别详解

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度...

    MySQL面试必备+Explain的讲解+简单优化+MyISAM、InnoDB存储引擎区别+MySQL为什么选择B+树索引+MySQL中的锁

    MySQL存储引擎 区别(MyISAM, InnoDB) 1,innodb支持事务,myisam不支持事务 2,innodb支持外键,而myisam不支持。对一个支持外间的innodb转换为myisam时会失败 3,innodb不保存表的具体行数,执行 select count(*)...

    MySQL数据库三种常用存储引擎特性对比

    不支持事务:MyISAM存储引擎不支持事务,所以对事务有要求的业务场景不能使用 表级锁定:其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能 读写互相阻塞:不仅会在写入的时候...

    深入探讨:MySQL数据库MyISAM与InnoDB存储引擎的比较

    MySQL有多种存储引擎,MyISAM和InnoDB是其中常用的两种。这里介绍关于这两种引擎的一些基本概念(非深入介绍)。MyISAM是MySQL的默认存储引擎,基于传统的ISAM类型,支持全文搜索,但不是事务安全的,而且不支持外键...

    深入MySQL存储引擎比较的详解

    但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,...

    浅谈MySQL中四种常用存储引擎

    (1):MyISAM存储引擎: 不支持事务、也不支持外键,优势是访问速度快,对事务完整性没有 要求或者以select,insert为主的应用基本上可以用这个引擎来创建表 支持3种不同的存储格式,分别是:静态表;动态表;压缩...

    MySQL存储引擎简介及MyISAM和InnoDB的区别

    MyISAM:默认的MySQL插件式存储引擎,它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。注意,通过更改 STORAGE_ENGINE 配置变量,能够方便地更改MySQL服务器的默认存储引擎。 InnoDB:用于事务处理应用...

    CLZRT#Class-Notes#数据库优化1

    1.存储引擎(在于教会选择合适的引擎) 1.什么是存储引擎(作用,具体实现) 2.存储引擎的选择 3.InnoDB存储引擎 4.MyISAM存储引擎 2.索引

    详解MySQL性能优化(一)

    MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件。首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件,另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据...

    MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问。为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数据库引擎(5.5版之前),由...

Global site tag (gtag.js) - Google Analytics