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-所有数据库和所有表。查询执行时间类似于按版本分组。谢谢