mysql完全锁定在一个简单的查询上

mysql完全锁定在一个简单的查询上,mysql,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及其

我有一个疑问:

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-悲伤但真实 我只需要一个版本

表“recording”有1100万行,“track_name”有550万行。数据库是Mysql,表是MyISAM

问题是,当我运行这个查询时,整个mysql都被锁定了。它会将此服务器上所有数据库中的所有表锁定大约15分钟。所有查询等待所有数据库中所有表上的表锁定。myisam不应该只锁定查询正在使用的表吗(在我的例子中是recording和track_name)

解释扩展的显示:

    +----+-------------+-------+--------+--------------------+---------+---------+---------------+----------+----------+---------------------------------+
| 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

尝试使用不同的:

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的弱点是,
groupby

在字段和条件上做一个上限,然后你就不需要担心这个问题了。i、 e.其中upper(t1.列)=upper(t2.列),这样就查询而言,“Sad但True”、“Sad但True”和“Sad但True”都是相等的。您是否尝试过使用内部联接,而不是从两个表进行查询?从您提供的解释来看,我相信它正在扫描t2中每行10805478行。使用某种形式的连接可能会加快速度,并解决锁定问题。@Brian这是真的,但我需要在一个查询中包含所有艺术家及其独特歌曲的数组。@letuboy您能提供任何示例吗?我尝试了您的建议,但它仍然锁定整个mysql-所有数据库和所有表。查询执行时间类似于按版本分组。谢谢