gpt4 book ai didi

mysql - 使用 ibatis/spring/mysql 时如何提高查询的响应时间?

转载 作者:行者123 更新时间:2023-11-29 07:37:37 26 4
gpt4 key购买 nike

我有一个包含 2 个表的数据库,我必须运行一个简单的查询`

    select * 
from tableA,tableB
where tableA.user = tableB.user
and tablea.email LIKE "%USER_INPUT%"

其中 user_input 是必须匹配的 tablea.email 字符串的一部分。

问题:

该表将携带大约1000万个寄存器,并且需要一段时间,只有当先前的查询看起来相同时才会使用ibatis的缓存(据我所知)。例如:对于 USER_INPUT = john_doe 如果第二个查询再次是 john_doe 缓存将不起作用,但如果是 john_do 将不起作用(也就是说,正如我所说,据我所知)。

目前,tableA结构是这样的:

id int(11) not_null auto_increment
email varchar(255)not_null
many more fields...

我不知道 email ,255 的 varchar 是否会太长,因此可能需要更长的时间,例如,如果我将其减少到 150 个字符,响应时间会更短吗?

现在查询花费的时间太长...我知道我可以升级到服务器更多的内存,但我想知道是否有其他方法来改进此代码。

tableA 和 tableB 各有大约 30 个字段,它们通过关系模式上的 ID 相关联。

我将为 tableA.email 创建索引。

想法?

最佳答案

我建议在数据库中为该查询运行执行计划。这将告诉数据库计划如何执行您的查询,以及您正在寻找的东西类似于“全表扫描”。我猜您会看到这一点,因为 like 子句和电子邮件字段的索引对这部分没有帮助。

如果您需要按电子邮件地址的子字符串进行搜索,您可能需要考虑存储数据的粒度。例如,您可以将电子邮件地址分成两个字段(或者可能更多),而不是像往常一样将电子邮件地址存储在单个字段中,其中“@”之前的所有内容都在一个字段中,而域名则在另一个字段中。然后,您可以通过任一组件进行搜索,而无需 like,然后索引将显着加快速度。例如,您可以执行以下操作来搜索:

WHERE tableA.email_username = 'USER_INPUT' OR tableA.email_domain = 'USER_INPUT'

当然,您必须连接这两个字段来重新创建电子邮件地址,但我认为 iBatis 会让您向数据对象添加一个方法,以便在单个位置而不是在您的应用程序中的所有地方执行此操作(已经有一段时间了)不过,因为我使用了 iBatis,所以我可能是错的)。

关于mysql - 使用 ibatis/spring/mysql 时如何提高查询的响应时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30226776/

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