2012-01-05 95 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