我在MySQL中有一个特殊的查询,它使用collate比较来自两个不同表(索引)的值,但这不会执行数小时。查询如下:
create temporary table elig_temp
select id from table_elig;
create index elig_temp on elig_temp(id);
create temporary table med_temp
select id from table_med;
create index med_temp on med_temp(id);
select COUNT(1) as result
from med_temp a
where exists
(
select 1
from elig_temp b
where a.id collate latin1_general_cs = b.id collate latin1_general_cs
)
FYI elig_temp表有70k记录,而med_temp有100万条记录 此外,table_elig和table_med表的id字段是来自同一表的另一个字段的散列加密值。因此,我也尝试使用二进制排序技术,例如udf8_bin和latin1_bin来运行查询,但我再次陷入困境。
我甚至尝试使用相同的排序技术定义,我使用查询,table_med和table_elig的每个字段(varchar和char),但没有运气。
请建议我使用任何可能的解决方案来有效地执行此查询时间。
答案 0 :(得分:0)
当您明确设置整理时,MySQL无法使用列上的索引。这很不幸。
首先,查询是否在没有排序规则的情况下运行?
select COUNT(1) as result
from med_temp a
where exists (select 1 from elig_temp b where a.id = b.id collate );
这是最简单的解决方案。
下一个解决方案是在创建表时使排序规则相同:
create temporary table elig_temp
select id collate latin1_general_cs as id
from table_elig;
create index elig_temp on elig_temp(id);
create temporary table med_temp
select id collate latin1_general_cs as id
from table_med;
create index med_temp on med_temp(id);
然后你可以运行上面的查询 - 没有明确的排序规则 - 它应该使用索引。