2011-08-17 49 views
0

我有一个非常大的表,我做了一个非常简单的查询就像id查找ups。 由于表行增加,查询随着时间变慢。 我在第二秒执行了大约300个查询,它使我的脚本运行缓慢,内存达到99%(内存低于数据库的大小) 我想对表进行分区和子分区以获得最佳性能,这里是我的表(30个表中有这样的表),请添加一个代码,因为我对分区非常陌生,而且知之甚少。 select查询只是id查找和简单插入的where子句。 我想升级内存要高于数据库大小,但我想避免它,我不知道它是否会解决问题更好,然后分区。通过主键和2个索引分区和子分区mysql表来提高性能

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `url` (`url`(333)), 
    INDEX `name` (`name`) 
) 
COLLATE='utf8_unicode_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=937 

这里是我的查询的一些例子:

SELECT id FROM books WHERE url = 'blabla'; 
INSERT INTO user_books SET book_id = '3', user_id = '10'; 

每个查询大约需要0.05-0.2秒

我得到了在每个表大约5-10万行。

DB大小为10GB我想到了升级内存至16GB

+0

“非常大”的行数?你执行的查询的例子是什么?解释计划是什么样的?每个查询需要多长时间? –

+0

@Derek我用你问的细节编辑了问题。 – Ben

+0

如果可能,使用innodb并利用聚簇索引http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 –

回答

2

如果你只是想尝试添加分区,我推荐使用分区的关键。这实质上只是将该表与应用于分区指定的列的内部散列函数进行分区。

在你的情况下,查询好像使用id最多,因为这是主键,语法很简单:

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci', 
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    INDEX `url` (`url`(333)), 
    INDEX `name` (`name`) 
) 
PARTITION BY KEY() 
PARTITIONS 8; 
COLLATE='utf8_unicode_ci' 
ENGINE=MyISAM 
ROW_FORMAT=DEFAULT 
AUTO_INCREMENT=937 

以上将创建8个分区。由于我没有指定任何列用于分区子句,因此MySQL默认使用主键,这对您的情况来说可能没问题。

假设id列中使用的整数值的合理均衡分布,每个分区大约为1.25 GB。为特定ID启动查询现在应该只从一个分区中选择数据,这将提高访问速度。

您可以参考这里MySQL文档:http://dev.mysql.com/doc/refman/5.5/en/partitioning-key.html

毋庸置疑,ID是主键,所以这应该已经是相当高性能的。我不确定可能适用于MyISAM索引+分区的更多警告。我主要与InnoDb合作,而这正是我至少用InnoDb来提高查询性能的原因。