2011-08-17 64 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來提高查詢性能的原因。