MySQL整理查询永远运行

时间:2014-09-01 12:13:26

标签: mysql collate

我在MySQL中有一个特殊的查询,它使用collat​​e比较来自两个不同表(索引)的值,但这不会执行数小时。查询如下:

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),但没有运气。

请建议我使用任何可能的解决方案来有效地执行此查询时间。

1 个答案:

答案 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);

然后你可以运行上面的查询 - 没有明确的排序规则 - 它应该使用索引。