完全鎖定了,我有這個疑問: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個CPU與8核(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
做上在球場上的狀態,你並不需要擔心的情況下再。即,其中上(t1.column)=上(t2.column) 這樣「悲哀而真實」,「悲哀而真實」和「悲哀而真實」都是平等的,只要查詢而言。 – Brian 2012-01-05 18:26:20
您是否嘗試過使用內部連接,而不是從兩個表中查詢?從你提供的解釋中,我確信它在t2中掃描每行10,805,478行。無論如何,使用某種形式的連接可能會更快,並解決鎖定問題。 – letuboy 2012-01-05 18:29:13
@布賴恩這是真的,但我需要所有的藝術家和他們的獨特歌曲的陣列中的一個查詢。 – Paxxil 2012-01-05 18:47:38