海量数据库和mysql

时间:2011-01-20 11:32:37

标签: mysql database-design optimization nosql

我们正在开展的一个新项目需要大量数据分析,但我们发现这非常慢,我们正在寻找通过软件和/或硬件来改变方法的方法。

我们目前正在亚马逊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

db的一部分是文章和实体以及链接表,例如:

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)

从下表中可以看出,我们有很多协会以每天10万以上的速度增长

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)

我们应该考虑什么来改善查询时间?不同的DB存储?不同的硬件。

3 个答案:

答案 0 :(得分:3)

正如mrorigo所说,请提供SHOW CREATE TABLE articles_entities,以便我们可以看到您桌子的实际索引。

来自MySQL文档http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

的说明
If the table has a multiple-column index, any leftmost prefix of the index can be used by the optimizer to find rows. 
For example, if you have a three-column index on (col1, col2, col3), you have indexed search capabilities on (col1), (col1, col2), and (col1, col2, col3).

MySQL cannot use an index if the columns do not form a leftmost prefix of the index

因此,如果relevance是多列索引的一部分,但不是该索引的最左列,则索引不会用于您的查询。

这是一个经常被忽视的常见问题。

答案 1 :(得分:2)

使用char(36)作为密钥并不是你用MySQL做的最快的。如果可能,请使用INT类型作为密钥。如果索引CHAR列,则索引与(BIG)INT索引相比非常大(如果没有“正确”创建)

但是,如果您的列值不是数字,则会陷入CHAR列(其中ARE列仍然比VARCHAR快,但可以创建大型索引)。

请提供一个SHOW CREATE TABLE表来查看关键/索引参数,并且如前面的答案所述,有问题查询的EXPLAIN可以帮助提供更好的答案。

PS。使用SHOW TABLE STATUS LIKE '{table_name}'查看表的索引(和数据)大小。

答案 2 :(得分:1)

在查询性能方面,有三件事情很重要:

指标的影响。 记忆。 其他一切。

要做的第一件事是检查索引。对您的查询进行EXPLAIN以了解MySQL如何处理它们。

如果这看起来合情合理,接下来就是检查内存。你的总数据库有多大?内存现在很便宜,从内存运行的查询将比必须从磁盘读取的查询快得多。

在您探索了这些之后,如果性能仍然很慢,那么可能是考虑其他选项的时候了。