10bet网址
MySQL 5.7参考手册
相关的文档10bet官方网站 下载本手册
PDF(美国高级主任)- 36.3 mb
PDF (A4)- 36.3 mb
手册页(TGZ)- 235.4 kb
手册页(Zip)- 347.1 kb
信息(Gzip)- 3.3 mb
信息(邮政编码)- 3.3 mb
本手册节选

8.6.1优化MyISAM查询

关于加速查询的一些一般技巧MyISAM表:

  • 要帮助MySQL更好地优化查询,请使用分析表或运行myisamchk——分析在表中加载数据之后。这将更新每个索引部分的值,该值指示具有相同值的平均行数。(对于唯一索引,该值总是1。)MySQL使用它来决定在基于非常量表达式连接两个表时选择哪个索引。您可以通过使用来检查表分析的结果显示索引来自tbl_name检查基数价值。Myisamchk——描述——冗长显示索引分布信息。

  • 若要根据索引对索引和数据排序,请使用Myisamchk——sort-index——sort-records=1(假设你想要在索引1上排序)。如果你有一个唯一的索引,你想要根据索引的顺序读取所有行,这是一个使查询更快的好方法。第一次以这种方式对大型表进行排序时,可能需要很长时间。

  • 尽量避免复杂的选择查询MyISAM频繁更新的表,以避免由于读取器和写入器之间的争用而导致的表锁定问题。

  • MyISAM支持并发插入:如果一个表在数据文件中间没有空闲块,则可以插入在其他线程从表中读取数据的同时,向表中插入新的行。如果能够做到这一点很重要,请考虑以避免删除行的方式使用表。另一种可能是竞选优化表在从表中删除大量行的情况下,对表进行碎片整理。属性可以改变此行为concurrent_insert变量。您可以强制添加新行(因此允许并发插入),即使在已删除行的表中也是如此。看到第8.11.3节“并发插入”

  • MyISAM经常更改的表,尽量避免所有可变长度列(VARCHAR,文本).如果表包含单个变长列,则使用动态行格式。看到第15章,替代存储引擎

  • 仅仅因为行变大,将一个表分割成不同的表通常是没有用的。在访问一行时,最大的性能影响是查找行第一个字节所需的磁盘寻道。在找到数据之后,大多数现代磁盘可以以足够快的速度读取整个行,以满足大多数应用程序的需求。拆分表产生明显差异的唯一情况是如果它是MyISAM表使用动态行格式,您可以将其更改为固定行大小,或者如果您经常需要扫描表但不需要大多数列。看到第15章,替代存储引擎

  • 使用修改表…命令expr1expr2,……如果你通常检索行expr1expr2,……秩序。在对表进行大量更改后使用此选项,您可能能够获得更高的性能。

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

    更新tbl_namecount_colcount_col+ 1,key_col常数

    这是非常重要的,当你使用MySQL存储引擎,如MyISAM它只有表级锁定(多个读取器和单个写入器)。这也为大多数数据库系统提供了更好的性能,因为在这种情况下行锁定管理器需要做的事情更少。

  • 使用优化表定期使用动态格式避免碎片MyISAM表。看到第15.2.3节“MyISAM表存储格式”

  • 声明一个MyISAM表的DELAY_KEY_WRITE = 1表选项使索引更新更快,因为直到关闭表才将索引刷新到磁盘。的缺点是,如果在打开这样一个表时,有什么东西杀死了服务器,那么您必须通过使用myisam_recover_options系统变量设置,或由运行myisamchk在重新启动服务器之前。(然而,即使在这种情况下,你也不应该因为使用而失去任何东西DELAY_KEY_WRITE,因为键信息总是可以从数据行中生成。)

  • 字符串会自动压缩进前缀空格和结尾空格MyISAM索引。看到第13.1.14节,CREATE INDEX语句

  • 您可以通过在应用程序中缓存查询或答案,然后一起执行许多插入或更新来提高性能。在此操作期间锁定表可确保在所有更新之后仅刷新索引缓存一次。你也可以利用MySQL的查询缓存来达到类似的效果;看到第8.10.3节“MySQL查询缓存”