完全锁定了,我有这个疑问: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