2015-03-31 150 views
0

我在MySQL如下表:非常慢MySQL的讀取性能

CREATE TABLE tweetdb(
     tweetid BIGINT(18) UNSIGNED NOT NULL, 
     userid INT(10) UNSIGNED NOT NULL, 
     timestamp CHAR(14), 
     tweet TEXT, 
     score TINYINT, 
    PRIMARY KEY(tweetid, userid) 
) ENGINE=MYISAM PARTITION BY KEY(userid) PARTITIONS 101; 

+-----------+---------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+---------------------+------+-----+---------+-------+ 
| tweetid | bigint(18) unsigned | NO | PRI | NULL |  | 
| userid | int(10) unsigned | NO | PRI | NULL |  | 
| timestamp | char(14)   | YES |  | NULL |  | 
| tweet  | text    | YES |  | NULL |  | 
| score  | tinyint(4)   | YES |  | NULL |  | 
+-----------+---------------------+------+-----+---------+-------+ 
5 rows in set (0.29 sec) 

我在這個表210萬行。 我的暗潮服務器(Java應用程序)發送GET與以下選擇查詢:

"SELECT test.tweetdb.tweetid, test.tweetdb.tweet, test.tweetdb.score FROM test.tweetdb WHERE test.tweetdb.userid = 287543000 AND test.tweetdb.timestamp = 20140420000829;" 

我使用用戶標識和時間戳來獲得滿意的結果,因爲它是唯一我可以用來驗證數據庫中的數據。該數據庫僅用於只讀目的,沒有寫入/更新。

我也在桌上使用了一個索引。

mysql> SHOW INDEX FROM tweetdb; 
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
| tweetdb |   1 | id_index |   1 | userid  | A   |   1 |  NULL | NULL | YES | BTREE  |   |    | 
| tweetdb |   1 | id_index |   2 | timestamp | A   |   1 |  NULL | NULL | YES | BTREE  |   |    | 
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
2 rows in set (0.00 sec) 

現在,即使使用分區以及將主鍵後,它需要幾乎1秒至與正確的響應,這是很長的響應回。我的應用程序必須具有每秒至少6000個請求的吞吐量。

硬件配置:

我運行的暗潮服務器(前端)查詢在Amazon M1.large例如MySQL服務器(後端)。爲了避免延遲,我在同一個實例上運行兩臺服務器。

任何人都可以幫我嗎?我正在耗盡想法。 謝謝!從暗潮前端服務器

更新

mysql> EXPLAIN SELECT * FROM test.tweetdb LIMIT 1; 
+----+-------------+---------+------+---------------+------+---------+------+-----------+-------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows  | Extra | 
+----+-------------+---------+------+---------------+------+---------+------+-----------+-------+ 
| 1 | SIMPLE  | tweetdb | ALL | NULL   | NULL | NULL | NULL | 270119913 |  | 
+----+-------------+---------+------+---------------+------+---------+------+-----------+-------+ 
1 row in set (3.67 sec) 


mysql> EXPLAIN SELECT * FROM test.tweetdb WHERE test.tweetdb.userid=287543000 AND test.tweetdb.timestamp=20140420000829; 
+----+-------------+---------+------+---------------+------+---------+------+---------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+---------+------+---------------+------+---------+------+---------+-------------+ 
| 1 | SIMPLE  | tweetdb | ALL | NULL   | NULL | NULL | NULL | 2657601 | Using where | 
+----+-------------+---------+------+---------------+------+---------+------+---------+-------------+ 
1 row in set (0.00 sec) 

時間

The time it takes is 1.3 seconds

+0

什麼'解釋select ...'說? – 2015-03-31 10:25:02

+0

更新了問題。 – AngryPanda 2015-03-31 10:30:23

+0

這是清除它沒有使用任何索引,你可能需要添加一個索引作爲'alter table test.tweetdb add index user_timestamp_idx(userid,timestamp)' – 2015-03-31 10:32:13

回答

0

你的主鍵是tweetid和用戶ID的組合。而對於mysql,它將進行全面搜索,因爲您的表具有combile列的主鍵。您可以創建另一個只有userid的密鑰。 對於mysql,如果你有兩列的密鑰,那麼他們應該出現在其他地方,否則它認爲它整個表搜索

+0

在我的數據集中,用戶標識和時間戳組合不是唯一的。 twitterbot可以同時創建多個推文。 我想在tweetid,userid和timestamp上創建一個主鍵,但隨後將數據加載到表中需要很長時間。 你是否建議我將主鍵放在一起? – AngryPanda 2015-03-31 10:57:30