如何在mysql查询中使用索引效率

如何在mysql查询中使用索引效率,mysql,indexing,performance,Mysql,Indexing,Performance,我的数据库正在mysql v5.x上运行。我有一个有5列的表T1,列C1是主键。C1为varchar20型。它包含大约2000行,其值如下: fxg axt3 tru56 and so on.. 现在,我的应用程序的任务是读取输入数据,并查找输入数据是否具有类似于表T1中C1列中的启动模式。例如:我的输入可能显示为: trx879478986 fxg87698x84 784xtr783utr axt3487ghty ... and so on 因此,对于上述

我的数据库正在mysql v5.x上运行。我有一个有5列的表T1,列C1是主键。C1为varchar20型。它包含大约2000行,其值如下:

fxg
axt3
tru56
and so on.. 
现在,我的应用程序的任务是读取输入数据,并查找输入数据是否具有类似于表T1中C1列中的启动模式。例如:我的输入可能显示为:

    trx879478986
    fxg87698x84
    784xtr783utr
    axt3487ghty
... and so on
因此,对于上述输入,我必须为“fxg87698x84”和“axt3487ghty”返回true,为其他输入返回false。我使用的查询是:

select 1 from T1 where (? like concat(C1,'%'));
note: the ? is replaced by the input value got from the application.

问题是我的输入量很大,大约100万条记录需要在30分钟内处理,而我的查询速度不够快。关于如何重新编写查询或强制它使用索引有什么想法吗?即使我必须使用不同的对象结构,我也可以这样做,如果这有帮助的话。因此,任何帮助都将不胜感激。Thx.

按照设置问题的方式,根据定义,您几乎需要按照当前的方式检查数据库中的每一行。在这种情况下,索引实际上并不重要,因为任何一行都可能是匹配的

我不确定它是否会更快,但您可以尝试的一件事是在数据库中查询输入的每个可能有效的子字符串的精确匹配

例如,如果您知道子字符串的长度必须至少为3才能匹配,请从前3个字符开始: trx879478986=>trx,trx8,trx87

构建这些可能匹配项的数组,并使用IN运算符查询它们:

SELECT 1 FROM T1 WHERE c1 IN ($array_of_strings);

我非常确定mysql可以使用索引来匹配

中给定的值列表。您可以尝试使用Top-N查询来查找第一个候选值,然后将该候选值仅应用于实际模式:

select 1 
  from (select c1 
          from junk 
         where c1 <= 'fxg87698x84'
         order by c1 desc limit 1) tmp 
 where 'fxg87698x84' like concat(c1, '%');
top-n查询应该在c1上使用常规索引

编辑:
在我的博客中更详细地解释了这一点:

我的建议——只是我会添加一个“按字符长度c1排序”来支持“ATX12345”与“ATX”+1的匹配,这是我输入的内容。这确实使用了索引,通过避免类似于您避免的问题,即如果C1包含一个%或uu字符.Thx作为输入,会发生什么。但是我必须做的有效子字符串的组合在3个字符到20个字符之间,额外的处理会抵消我可能获得的性能增益。你知道这是真的吗,还是你在猜测性能成本?太好了!!。这确实有助于减少我的全表扫描。又是thxAbdullah@Abdullah答案是不正确的。比较“fxg”