关于加速查询的一些一般技巧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章,替代存储引擎.使用
修改表…命令
如果你通常检索行expr1
,expr2
,……
秩序。在对表进行大量更改后使用此选项,您可能能够获得更高的性能。expr1
,expr2
,……如果经常需要根据大量行的信息计算结果(例如计数),最好引入一个新表并实时更新计数器。以下表单的更新非常快:
更新tbl_name集count_col=count_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查询缓存”.