加速查询的一些一般提示MyISAM
表:
要帮助MySQL更好地优化查询,请使用
分析表
或运行myisamchk——分析在已加载数据的表上。这将更新每个索引部分的值,该值指示具有相同值的平均行数。(对于唯一索引,这总是1。)MySQL使用它来决定在基于非常数表达式连接两个表时选择哪个索引。您可以使用命令检查表分析的结果显示指数从
和检查tbl_name
基数
价值。myisamchk——描述详细显示索引分布信息。要根据索引对索引和数据进行排序,可以使用myisamchk——排序索引排序记录= 1(假设您希望对索引1进行排序)。如果您有一个惟一的索引,希望根据索引从其中按顺序读取所有行,那么这是一种提高查询速度的好方法。第一次以这种方式对一个大表进行排序时,可能会花费很长时间。
尽量避免复杂
选择
查询MyISAM
频繁更新的表,以避免由于读取器和写入器之间的争用而导致的表锁定问题。MyISAM
支持并发插入:如果一个表在数据文件中间没有空闲块,则可以插入
在其他线程从表中读取数据的同时,向表中添加新行。如果能够做到这一点很重要,请考虑以避免删除行的方式使用表。另一种可能是逃跑优化表
在从表中删除大量行之后对表进行碎片整理。属性可以改变此行为concurrent_insert
变量。即使在已删除行的表中,也可以强制追加新行(因此允许并发插入)。看到第8.11.3节“并发插入”.为
MyISAM
经常更改的表,尽量避免所有变长列(VARCHAR
,团
,文本
).如果该表包含单个可变长列,则该表使用动态行格式。看到第十六章,替代存储引擎.仅仅因为行变大,就将一个表分割成不同的表通常是没有用的。在访问一行时,最大的性能冲击是查找行第一个字节所需的磁盘寻道。在找到数据之后,大多数现代磁盘能够以足够快的速度读取整个行,以满足大多数应用程序的需求。分割表会产生明显差异的惟一情况是,它是一个
MyISAM
表使用动态行格式,您可以将其更改为固定的行大小,或者如果您经常需要扫描表,但不需要大多数列。看到第十六章,替代存储引擎.使用
ALTER TABLE……命令
如果您通常检索行expr1
,expr2
,……
秩序。通过在对表进行大量更改之后使用此选项,您可能能够获得更高的性能。expr1
,expr2
,……如果您经常需要根据来自大量行的信息计算结果,例如计数,那么最好引入一个新表并实时更新计数器。以下表单的更新非常快:
更新tbl_name集count_col=count_col+ 1,key_col=常数;
这一点在使用MySQL存储引擎时非常重要
MyISAM
它只有表级锁定(多个读取器和单个写入器)。这也为大多数数据库系统提供了更好的性能,因为在这种情况下行锁定管理器的工作较少。使用
优化表
定期使用动态格式以避免碎片化MyISAM
表。看到第16.2.3节,“MyISAM表存储格式”.声明一个
MyISAM
表DELAY_KEY_WRITE = 1
表选项使索引更新更快,因为在表关闭之前它们不会刷新到磁盘。的缺点是,如果在这样一个表打开时,有什么东西关闭了服务器,那么您必须通过使用myisam_recover_options
系统变量设置,或通过运行myisamchk重新启动服务器之前。(然而,即使在这种情况下,你也不应该因为使用而失去任何东西DELAY_KEY_WRITE
,因为关键信息总是可以从数据行生成。)字符串被自动压缩进前缀和结束空间
MyISAM
索引。看到第13.1.15节“CREATE INDEX语句”.您可以通过在应用程序中缓存查询或答案,然后一起执行许多插入或更新来提高性能。在此操作期间锁定表可以确保在所有更新之后只刷新一次索引缓存。