【发布时间】:2011-06-12 09:45:10
【问题描述】:
我们正在进行的一个新项目需要大量数据分析,但我们发现这非常缓慢,我们正在寻找通过软件和/或硬件改变我们方法的方法。
我们目前在亚马逊 ec2 实例 (linux) 上运行:
High-CPU Extra Large Instance
7 GB of memory
20 EC2 Compute Units (8 virtual cores with 2.5 EC2 Compute Units each)
1690 GB of instance storage
64-bit platform
I/O Performance: High
API name: c1.xlarge
processor : 7
vendor_id : GenuineIntel
cpu family : 6
model : 26
model name : Intel(R) Xeon(R) CPU E5506 @ 2.13GHz
stepping : 5
cpu MHz : 2133.408
cache size : 4096 KB
MemTotal: 7347752 kB
MemFree: 728860 kB
Buffers: 40196 kB
Cached: 2833572 kB
SwapCached: 0 kB
Active: 5693656 kB
Inactive: 456904 kB
SwapTotal: 0 kB
SwapFree: 0 kB
数据库的一部分是文章和实体以及链接表,例如:
mysql> DESCRIBE articles_entities;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| id | char(36) | NO | PRI | NULL | |
| article_id | char(36) | NO | MUL | NULL | |
| entity_id | char(36) | NO | MUL | NULL | |
| created | datetime | YES | | NULL | |
| modified | datetime | YES | | NULL | |
| relevance | decimal(5,4) | YES | MUL | NULL | |
| analysers | text | YES | | NULL | |
| anchor | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)
从下表可以看出,我们有很多协会以每天 100,000+ 的速度增长
mysql> SELECT count(*) FROM articles_entities;
+----------+
| count(*) |
+----------+
| 2829138 |
+----------+
1 row in set (0.00 sec)
像下面这样的简单查询花费了太多时间(12 秒)
mysql> SELECT count(*) FROM articles_entities WHERE relevance <= .4 AND relevance > 0;
+----------+
| count(*) |
+----------+
| 357190 |
+----------+
1 row in set (11.95 sec)
我们应该考虑什么来缩短查找时间?不同的数据库存储?不同的硬件。
【问题讨论】:
-
您的表格是否正确编入索引?
-
从提供的表转储中不是很明显吗?
-
您是否考虑过使用除 char 之外的其他内容作为 id?在 PostgreSQL 设置中,我在具有 +2000 万条记录和 +5 亿条记录的表之间进行内部连接,使用数字 ID 产生了显着差异。速度要快得多。
-
能否请您为您提供的慢速 SELECT 发表解释?
-
也许您的第一步应该是聘请具有优化大型系统经验的数据库专业人员。从您的设计(A char(36) PK?)和您没有这样的人的问题中可以清楚地看出。高性能的大型数据库设计和调优不应该由业余爱好者完成。这不是可以从诸如此类的板上的问题中解决的问题。
标签: mysql database-design optimization nosql