这类似于我的另一篇文章,但现在我有一个不同的表结构,并且仍然不清楚应该更改哪些 MySQL 参数以利用我的机器拥有的额外 ram---所以如果它看起来像重复的,让我知道如何最好地改写我要问的内容。
我有下表:create table mytable (id1 int, id2 int, score float) engine MyISAM,
有 500 亿条记录。
我计划在第一列 ( alter table mytable add index myindex (id1)
) 上添加一个索引,我想知道可以更改哪些 MySQL 参数以利用这个额外的内存(例如缓冲区?)?
注意:引擎类型不需要是 MyISAM,如果有区别的话。
您首先关心的是数据加载。由于您不打算拥有主键,而只是一个索引,因此在任何 UNIX 风格中,您都应该在按索引列 id1 加载之前对数据进行排序:
要加载数据,请在 MySQL 提示符下使用 mysqlimport 或 LOAD DATA。为了加快加载速度,MYISAM 表受益于增加 *bulk_insert_buffer_size*、*myisam_sort_buffer_size* 或 *key_buffer_size*,对于 INNODB 表,增加 *innodb_buffer_pool_size* 和 *innodb_log_file_size*。
这些增加可能还不够,并且随着内存填满,加载速度可能仍会减慢。在这种情况下,以块的形式加载数据会更有效。你可以通过在mysql根目录下每小时执行一次du来监控速度:
只是为了完整性(与这种特定情况无关):禁用索引也有助于加快加载过程。
现在开始查询:这有点复杂,因为它取决于您的数据以及您想要查询表的方式。影响性能的最大因素是:
缓冲区:由变量设置。执行您的典型查询并比较“显示变量”和“显示状态”输出以确定瓶颈。
索引:你已经涵盖了
联接:根据您与其他表联接的方式,
最好以数据仓库样式对您的表进行非规范化,
尤其是当您想要联接两个大表时。
有关数据加载和大表查询优化的精彩文章,请访问: http ://www.mysqlperformanceblog.com/2007/05/24/predicting-how-long-data-load-would-take/ http://www .mysqlperformanceblog.com/2006/06/09/why-mysql-could-be-slow-with-large-tables/
在以下位置查看这些变量和其他变量的默认值和允许值:http: //dev.mysql.com/doc/refman/5.5/en/server-system-variables.html