Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用ibatis/spring/mysql时,如何提高查询的响应时间?_Mysql_Spring_Ibatis - Fatal编程技术网

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

在使用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

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

    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和更高的可用