我有这个问题:
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 - 悲伤但真实 我只需要一个版本。
表“录制”有1100万行,“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 。它在RAID 10中具有 6x SSD 磁盘。
的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
答案 0 :(得分: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
......