背景
我们有大型平面文件,大约60GB,并且正在插入数据库。我们在插入过程中遇到了逐步降级的性能。
有问题的表格
CREATE TABLE `entity_briefs` (
`entity_brief_id` bigint(11) NOT NULL auto_increment,
`entity_id` bigint(11) default NULL,
`entity_table_prefix` char(2) default NULL,
`string_1` varchar(255) default NULL,
`string_2` varchar(255) default NULL,
`zip` varchar(25) default NULL,
`phone` bigint(11) default NULL,
PRIMARY KEY (`entity_brief_id`),
KEY `idx_entity_id` (`entity_id`),
KEY `idx_entity_table_prefix` (`entity_table_prefix`),
KEY `idx_zip` (`zip`),
KEY `idx_string_1` (`string_1`),
KEY `idx_string_2` (`string_2`),
KEY `idx_phone` (`phone`)
);
mysqltuner.pl输出:
>> MySQLTuner 1.1.1 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: xxxxx
Please enter your MySQL administrative password:xxxxx
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.85-community
[OK] Operating on 32-bit architecture with less than 2GB RAM
-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB -Federated +InnoDB -ISAM -NDBCluster
[--] Data in MyISAM tables: 101M (Tables: 1344)
[!!] InnoDB is enabled but isn't being used
[!!] Total fragmented tables: 1
-------- Security Recommendations -------------------------------------------
ERROR 1142 (42000) at line 1: SELECT command denied to user 'xxxx'@'localhost' for table 'user'
[OK] All database users have passwords assigned
-------- Performance Metrics -------------------------------------------------
[--] Up for: 5d 15h 53m 55s (2M q [4.395 qps], 9K conn, TX: 1B, RX: 425M)
[--] Reads / Writes: 51% / 49%
[--] Total buffers: 34.0M global + 2.7M per thread (500 max threads)
[OK] Maximum possible memory usage: 1.3G (67% of installed RAM)
[OK] Slow queries: 0% (9/2M)
[OK] Highest usage of available connections: 1% (5/500)
[!!] Key buffer size / total MyISAM indexes: 8.0M/105.3M
[!!] Key buffer hit rate: 94.1% (72M cached / 4M reads)
[!!] Query cache is disabled
[OK] Temporary tables created on disk: 7% (101 on disk / 1K total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 277K opened)
[OK] Open file limit used: 0% (127/18K)
[OK] Table locks acquired immediately: 99% (2M immediate / 2M locks)
[!!] Connections aborted: 38%
-------- Recommendations -----------------------------------------------------
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
Run OPTIMIZE TABLE to defragment tables for better performance
Enable the slow query log to troubleshoot bad queries
Set thread_cache_size to 4 as a starting value
Increase table_cache gradually to avoid file descriptor limits
Your applications are not closing MySQL connections properly
Variables to adjust:
key_buffer_size (> 105.3M)
query_cache_size (>= 8M)
thread_cache_size (start at 4)
table_cache (> 64)
要求: 为了加快插入速度,可以使用哪种优化策略?
答案 0 :(得分:3)
一些一般性的建议,因为我没有适合你的银弹:
我不认为随着表格大小的增长,你可以预期插件上的东西不会减慢。数据库插入时间通常会随着数据库大小而扩展,诀窍是尝试根据此期望使整体性能可接受。
如果速度变慢且CPU没有挂钩,那么您可能是数据库访问的I / O限制。如果您发现是这种情况,您可能需要尝试更快的驱动器,Raid 0,更快的驱动器控制器等。您甚至可以考虑在固态驱动器上构建数据库,然后在创建后将其复制到传统硬盘驾驶。对于文件系统上的mysql可以预期的随机访问行为,这些应该快得多,但我知道随着时间的推移你会“磨掉它们”。不过,你仍可以获得价格低于1万美元的固态存储空间。
另外,请仔细查看优化插入过程。在你提到的插入过程中禁用索引,虽然它不会停止逐渐减速,但应该显着加快整个过程。我从你的描述中得知你有一些插入脚本逻辑可以选择和插入,而不是简单的平面文件加载。您每个插入执行三个不同的查询,可能在客户端和数据库之间多次绕过数据。特别是看那个范围选择,并确保单独的查询没有表大小的不良性能特征。
另一种可能性是在问题上投入更多RAM并将其用作磁盘缓存。如果你正在运行那些范围选择的那个“其他表”在插入过程中没有被修改,那么如果你确定搜索时间确实是这里的性能限制,也许你可以在内存中减少驱动器搜索。