优化MySQL表的方法

|                                                                                                                   关闭。这个问题需要更加集中。它当前不接受答案。                                                      
已邀请:
这取决于您如何尝试对其进行优化。 为了提高查询速度,一个合适的索引(包括多列索引)将是一个很好的起点。请对所有查询进行解释,以了解花费了很多时间。优化读取数据的代码以存储数据,而不是重新查询。 如果旧数据不太重要,或者您要处理的数据过多,则可以按年,月,周或天轮换表格。这样一来,数据写入总是到一个非常小的表中。较旧的表都已过时(即tablefoo_2011_04),因此您有积压的订单。 如果要优化同一表中的大小,请确保使用适当的类型。如果获得可变长度的字符串,请使用varchar而不是静态大小的数据。不要使用字符串作为状态指示符,不要将枚举或int与辅助查找表一起使用。 服务器应该有很多内存,这样它就不会一直挂在磁盘上。 您还可以查看使用诸如memcached之类的缓存层。 有关实际问题是什么,您的情况以及您要优化的内容的更多信息将很有帮助。     
如果您的表是一种日志记录表,则可以有几种优化策略。 (1)仅存储基本数据。 如果其中没有必要的-可为空-的列,并且它们不用于聚合或分析,请将其存储到其他表中。保持主表较小。 例如)不存储原始HTTP_USER_AGENT字符串。预处理代理字符串,并存储较小的数据,这些正是您要查看的内容。 (2)将表格设为固定格式。 对于几乎固定长度的字符串,请使用CHAR,然后使用VARCHAR。这将有助于加快SELECT查询的速度。 例如)ip VARCHAR(15)=> ip CHAR(15) (3)汇总旧数据并定期将其转储到其他表中。 如果您不必每天查看整个数据,请将其定期分为表(年/月/日)并存储旧数据的汇总数据。 范例)Table_2011_11 / Table_2011_11_28 (4)不要为大表使用太多索引。 索引太多会导致插入查询的负担沉重。 (5)使用ARCHIVE引擎。 MySQL支持ARCHIVE ENGINE。该引擎支持zlib进行数据压缩。 http://dev.mysql.com/doc/refman/5.0/en/archive-storage-engine.html 它通常适合日志记录(AFAIK),缺少ORDER BY,REPLACE,DELETE和UPDATE并不是日志记录的大问题。     
您应该向我们展示SHOW CREATE TABLE表名的输出,以便我们可以看到列,索引等。 从所有方面看,似乎要实现MySQL的分区才能进一步提高性能。     
一些可能的策略。 如果数据集如此之大,则可以用于冗余存储某些信息:如果某些记录的访问频率比其他记录要高,则保留高速缓存表,对信息进行非规范化(以限制连接数或创建具有较少列的表,以便您有一个精简表以随时存储在内存中),或者保留摘要以快速求和。 可以通过定期生成摘要表或使用触发器来保持摘要表同步,甚至可以通过在最近一天使用缓存表(可以在其上计算实际总数)和历史摘要来结合两者数据...将为您提供完整的精度,而无需读取完整的索引。测试以查看在您的情况下可以提供最佳性能的方法。 按句点拆分表格当然是一种选择。这就像分区,但是Mayflower Blog建议您自己做,因为MySQL实现似乎有一定的局限性。 除此之外:如果这些历史表中的数据从未更改,并且您想减少空间,则可以使用myisampack。支持索引(必须重建),并且会报告性能提升,但是我怀疑您在读取单个行时会提高速度,但是在大型读取时会遇到性能下降(因为很多行需要解压缩)。 最后:您可以从历史数据中考虑所需的内容。它是否需要与您拥有的最新条目完全相同的信息,还是有些不再重要了?我可以想象,如果您有一个访问日志,例如,它存储了各种信息,例如ip,引荐网址,请求的网址,用户代理...也许在5年的时间里,用户代理对知道,将来自一个ip的所有请求的一页+ css + javascript +图像组合成一个条目是很好的(对于精确文件,也许有不同的多对一表),并且引荐网址仅需要数字发生次数,可以与确切时间或ip分离。     
不要忘记考虑存储数据的介质的速度。我认为您可以使用RAID磁盘来加快访问速度,或者可以将表存储在RAM中,但要达到130GB的存储空间可能会是一个挑战!然后再考虑处理器。我知道这不是您问题的直接答案,但可以帮助您实现目标。     
您仍然可以按照@Evan的建议,尝试使用表空间或\“ per-per-period \”结构进行分区。 如果您的全文搜索失败,则应转到Sphinx / Lucene / Solr。外部搜索引擎绝对可以帮助您更快地获得。 如果我们谈论的是表结构,则应尽可能使用最小的数据类型。 如果ѭ0太慢,并且对于大型表而言确实如此,则可以备份该表并还原它。在这种情况下,您当然需要停机一些时间。 作为底线: 如果您的问题与全文搜索相比,而不是在应用任何表格更改之前,请尝试使用外部搜索引擎。     

要回复问题请先登录注册