在使用ibatis/spring/mysql时,如何提高查询的响应时间?
我有一个包含2个表的数据库,我必须运行一个简单的查询`在使用ibatis/spring/mysql时,如何提高查询的响应时间?,mysql,spring,ibatis,Mysql,Spring,Ibatis,我有一个包含2个表的数据库,我必须运行一个简单的查询` select * from tableA,tableB where tableA.user = tableB.user and tablea.email LIKE "%USER_INPUT%" 其中,用户输入是tablea.email字符串中必须匹配的一部分 问题是: 该表将包含大约1000万个寄存器,需要一段时间,只有在前面的查询看起来相同的情况下才会使用ibatis的缓存(据我所知)。示例:对于U
select *
from tableA,tableB
where tableA.user = tableB.user
and tablea.email LIKE "%USER_INPUT%"
其中,用户输入是tablea.email字符串中必须匹配的一部分
问题是:
该表将包含大约1000万个寄存器,需要一段时间,只有在前面的查询看起来相同的情况下才会使用ibatis的缓存(据我所知)。示例:对于USER\u INPUT=john\u doe,如果第二个查询再次是john\u doe,缓存将不会工作,但如果是john\u doe,则不会工作(也就是说,据我所知)
目前,tableA结构如下所示:
id int(11) not_null auto_increment
email varchar(255)not_null
many more fields...
我不知道如果电子邮件,一个255的varchar可能太长,可能需要更长的时间,因为这一点,如果我减少到150个字符,例如,响应时间会更短吗
现在查询花费的时间太长。。。我知道我可以升级到更多的服务器内存,但我想知道是否有其他方法来改进这段代码
tableA和tableB各有大约30个字段,它们通过关系模式上的ID进行关联
我要为tableA.email创建一个索引
Ideas?MySQL不能在搜索字符串前面加通配符的类似查询上使用索引(
%query
)
您可以尝试全文搜索。您必须在电子邮件列中添加全文索引:
ALTER TABLE tablea
ADD FULLTEXT(email);
从那里你可以修改你的查询
SELECT *
FROM tableA,tableB
WHERE tableA.user = tableB.user
AND MATCH (tablea.email) AGAINST ('+USER_INPUT' IN BOOLEAN MODE)
您必须确保可以使用全文索引
全文索引只能用于MyISAM表。(在MySQL 5.6及更高版本中,它们也可以与InnoDB表一起使用。)
我建议在数据库中运行该查询的执行计划。这将告诉DB计划如何执行您的查询,您需要的是类似于“完整表扫描”的内容。我猜你会看到,由于
like
子句,电子邮件字段的索引对这一部分没有帮助
如果您需要通过电子邮件地址的子串搜索,您可能需要考虑如何存储数据的粒度。例如,与通常将电子邮件地址存储在单个字段中不同,您可以将它们分为两个字段(或者更多),其中“@”之前的所有内容都在一个字段中,域名在另一个字段中。然后,您可以按任意一个组件进行搜索,而不需要像这样的
,然后索引将大大加快搜索速度。例如,您可以执行以下操作来搜索:
WHERE tableA.email_username = 'USER_INPUT' OR tableA.email_domain = 'USER_INPUT'
当然,您必须将这两个字段连接起来才能重新创建电子邮件地址,但我认为iBatis将允许您在数据对象中添加一个方法,以便在单个位置而不是整个应用程序中执行此操作(虽然我使用iBatis已经有一段时间了,所以我可能是错的)。索引将有所帮助,但是像“%anything%”这样的几乎是个问题,我想不出任何帮助。您好,对于发出请求的其他方法,全文索引如何影响我数据库的性能?它不会占用太多内存吗?顺便说一下,我使用的是mysql 5.6,所以没有全文索引可用(因为它是InnoDB),索引需要更多内存。只要您有足够的内存,它就不会显著影响其他查询的性能。所有索引都需要额外的内存。@jpganz18如果您使用的是5.6,则可以在InnoDB中使用全文索引。5.5和更低不能。对不起,我的意思是5.1,只有5.6和更高的可用