gpt4 book ai didi

MySQL 整理查询永远运行

转载 作者:行者123 更新时间:2023-11-29 23:51:45 25 4
gpt4 key购买 nike

我在 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
)

仅供引用,elig_temp 表有 70k 条记录,而 med_temp 表有 100 万条记录。
此外,table_elig 和 table_med 表的 id 字段是同一表中另一个字段的哈希加密值。因此,我也尝试使用二进制排序规则技术,例如 udf8_bin 和 latin1_bin 来运行查询,但我再次陷入困境。

我什至尝试使用与查询相同的排序规则技术来定义 table_med 和 table_elig 的每个字段(varchar 和 char),但没有成功。

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

最佳答案

当您显式设置排序规则时,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);

然后您可以运行上述查询(无需显式排序规则),并且它应该使用索引。

关于MySQL 整理查询永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25605620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com