2012-01-05 91 views
1

完全鎖定了,我有這個疑問:MySQL在一個簡單的查詢

SELECT 
    t1.artist_id AS artist_id, 
    t2.name AS track_name 
FROM 
    media.recording t1, 
    media.track_name t2 
WHERE 
    t1.name = t2.id 
GROUP BY 
    t1.artist_id, 
    t2.name COLLATE utf8_general_ci 

所有字符串字段utf8_bin,但我需要區分大小寫不同的藝術家ID和他們的曲目名稱,因爲有很多很多重複,如: Metallica的 - 悲哀而真實, Metallica的 - 悲哀而真實, Metallica的 - 悲哀而真實 ,我需要只有一個版本。

表「記錄」有11萬行和「TRACK_NAME」有550萬行。數據庫是Mysql,表是MyISAM。

問題是,當我運行此查詢整個MySQL的鎖定。它將該服務器上所有數據庫中的所有表鎖定大約15分鐘。所有查詢都會等待所有數據庫中所有表上的表鎖。不應該myisam只鎖定查詢使用的表(在我的情況下記錄和track_name)?

EXPLAIN EXTENDED顯示:

+----+-------------+-------+--------+--------------------+---------+---------+---------------+----------+----------+---------------------------------+ 
| id | select_type | table | type | possible_keys  | key  | key_len | ref   | rows  | filtered | Extra       | 
+----+-------------+-------+--------+--------------------+---------+---------+---------------+----------+----------+---------------------------------+ 
| 1 | SIMPLE  | t1 | ALL | recording_idx_name | NULL | NULL | NULL   | 10805478 | 100.00 | Using temporary; Using filesort | 
| 1 | SIMPLE  | t2 | eq_ref | PRIMARY   | PRIMARY | 4  | media.t1.name |  1 | 100.00 |         | 
+----+-------------+-------+--------+--------------------+---------+---------+---------------+----------+----------+---------------------------------+ 

我認爲硬件不是問題。服務器具有4個CPU8核(32個核,64個線程)和64GB RAM。它有6X SSD磁盤RAID中的10

的my.cnf

max_connections   = 768 
key_buffer    = 6G 
table_cache    = 15360 
read_buffer_size   = 2M 
read_rnd_buffer_size  = 2M 
sort_buffer_size   = 1M 
tmp_table_size   = 128M 
max_heap_table_size  = 128M 
max_allowed_packet  = 16M 
bulk_insert_buffer_size = 16M 
myisam_sort_buffer_size = 128M 
thread_cache_size  = 64 
join_buffer_size   = 1M 

請幫助:) 謝謝!

-Paxxil

+1

做上在球場上的狀態,你並不需要擔心的情​​況下再。即,其中上(t1.column)=上(t2.column) 這樣「悲哀而真實」,「悲哀而真實」和「悲哀而真實」都是平等的,只要查詢而言。 – Brian 2012-01-05 18:26:20

+0

您是否嘗試過使用內部連接,而不是從兩個表中查詢?從你提供的解釋中,我確信它在t2中掃描每行10,805,478行。無論如何,使用某種形式的連接可能會更快,並解決鎖定問題。 – letuboy 2012-01-05 18:29:13

+0

@布賴恩這是真的,但我需要所有的藝術家和他們的獨特歌曲的陣列中的一個查詢。 – Paxxil 2012-01-05 18:47:38

回答

0

嘗試distinct

SELECT DISTINCT 
    t1.artist_id AS artist_id, 
    t2.name COLLATE utf8_general_ci AS track_name 
FROM 
    media.recording t1, 
    media.track_name t2 
WHERE 
    t1.name = t2.id 

MySQL的弱點是group by ...

+0

我已經嘗試過你的建議,但它仍然鎖定整個mysql - 所有數據庫和所有表。查詢執行時間與GROUP BY版本類似。謝謝。 – Paxxil 2012-01-05 18:45:49