1.MySQL优化Optimizing MyISAM Queries

介绍

以下方法可以提高MyISAM引擎的查询效率:

  • 为了帮助MySQL更好的优化查询,当一个表加载了数据之后可以使用 ANALYZE TABLE或者myisamchk --analyze分析表。这会更新每个索引部分的值,以指示具有相同值的平均行数,(对于unique indexes,这个是一直是1)MySQL使用它来决定在基于非常量表达式连接两个表时选择哪个索引。可以使用SHOW INDEX FROM tbl_name检查表的分析结果以及基数值, myisamchk --description --verbose 显示索引的描述信息。

  • 根据索引对数据和索引进行排序, 使用myisamchk --sort-index --sort-records=1(假设您要对索引1进行排序)。假如表拥有一个唯一索引并相对查询的所有行进行排序,这个操作可以极大提高查询效率。对一张大表第一次进行排序,可能需要很长时间。

  • 尽量避免SELECT 对MyISAM经常更新的表进行复杂查询,以避免由于读者和编写者之间的争用而导致的表锁定问题。

  • MyISAM支持并发插入:当一个表在一个数据文件当中并没有空闲块,则可以通过其他线程在读取的时候插入新数据。假如上述情况对系统很重要,那么不要使用DELETE删除表数据。另一种方法是在表删除大量数据后使用OPTIMIZE TABLE语句对表碎片进行整理。可以修改 concurrent_insert 参数,他可以强制保证新添加的行在表末尾添加,即使表包含DELETE语句。

  • 对于MyISAM的频繁修改的表,尽量避免所有变长列(VARCHAR, BLOB,和 TEXT)。如果表包含单个可变长度列,则表使用 dynamic行格式。

  • 通常来说将一个表分割成几个不同的表并没有什么用处,这是因为行变大了。在访问表时,最大的性能损失是找到行的第一个字节所需的磁盘搜索。找到数据后,大多数现代磁盘可以足够快的读取整行,以满足大多数应用程序的要求。拆分表的会产生明显的差异唯一情,如果它是MyISAM使用dynamic行格式的表,您可以更改为固定的行大小,或者如果您经常需要扫描表但不需要大多数列。

  • 如果您通常按顺序检索行, 请使用 ALTER TABLE … ORDER BY expr1, expr2, …。通过对表进行大量更改后使用此选项,您可以获得更高的性能。

  • 如果您经常需要根据来自大量行的信息计算结果,例如计数,则最好引入新表并实时更新计数器。以下表单的更新非常快:

      UPDATE tbl_name SET count_col=count_col+1 WHERE key_col=constant;
    

    当您使用MySQL存储引擎时,这非常重要,例如MyISAM只有表级锁定(多个读取器与单个编写器)。这也为大多数数据库系统提供了更好的性能,因为在这种情况下可以不使用行锁定管理器。

  • 定期OPTIMIZE TABLE可以避免使用dynamic-format格式的MyISAM表产生过多的磁盘碎片。

  • 使用DELAY_KEY_WRITE = 1表选项声明MyISAM表会使索引更新更快,因为在表关闭之前它们不会刷新到磁盘。缺点是,如果在打开这样的表时某些东西会杀死服务器,则必须通过运行带有该–myisam-recover-options 选项的服务器或在重新启动服务器之前运行myisamchk来确保表可以正常运行 。(但是,即使在这种情况下,您也不会因DELAY_KEY_WRITE使用而丢失任何内容 ,因为可以重新创建索引。)

  • 字符串在MyISAM索引中自动压缩前缀和末尾空间。

  • 您可以通过在应用程序中缓存查询或答案,然后一起执行许多插入或更新来提高性能。 在此操作期间锁定表可确保仅在所有更新后刷新索引缓存一次。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值