搜索具有许多不同值的许多行

问题描述 投票:0回答:2

我正在寻找在MySQL中实现缓存的方法。我这样做是因为我正在开发的应用程序需要缓存,但没有持久性。

我保留了文件的SHA-1校验和的集合。用户可以向我提供校验和的列表,我需要返回给他们我数据库中没有的校验和。我期望数据库中校验和的数量约为一百万,而要检查的值的数量约为十万。

幼稚的方法是发出一长串字符串

SELECT COUNT(*) FROM myTable WHERE checksum = '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12';

这可以通过使用在Python连接器中使用参数的能力进行一些优化。但是,这似乎在python进程和MySQL进程之间的连接上引起很大的混乱。

我知道SELECT checksum FROM myTable NOT IN (SELECT someOtherTable WHERE someClause)有一种方法,除了我要检查的校验和列表在我的Python进程中,而不是在MySQL表中,这与我需要的匹配。

查找不在列表中的校验和的最佳方法是什么,该列表最初仅在我的Python进程中可用(因此必须通过IPC在MySQL上共享)

python mysql sql
2个回答
0
投票

不确定您要问什么。据我所知,查询是最优化的。更好的选择是使用NOT EXISTS并在表的唯一键或主键上具有索引,以便快速检索。

为表编制索引将给出从中进行搜索的顺序。因此,检索速度更快。

  SELECT checksum FROM myTable t
   Where not exists(SELECT 1 
      From someOtherTable 
    WHERE someClause=t.someid),

0
投票

您的表必须具有按校验和字段的索引。

[当用户提供校验和列表时,您必须创建临时表,将这些值存储在其中,通过shecksum字段构建索引,并使用带有SOIN的sommon简单查询进行搜索。

插入要搜索的值列表的最快方法是将它们保存到texst文件中,然后使用LOAD DATA INFILE加载到临时表中。如果客户端具有足够的权限在MySQL的服务器文件系统中创建文件,则适用。

如果不可能,则按块插入值。

© www.soinside.com 2019 - 2024. All rights reserved.