2014-10-29 75 views
0
SELECT a, b,c, table1.a, e FROM table1, table2  
WHERE (table1.a = table2.a and table2.id='111') 
and TIME_TO_SEC(TIMEDIFF(NOW() , table2.time)) < 172800 

我的查询属于这种类型,其中a和id是table1和table2中的索引。 这个查询需要很长时间才能执行。两个表都有数百万个数据。我该如何解决这个问题?如何控制两个表之间的mysql查询执行时间

+0

数百万条记录需要什么?并告诉我们你到目前为止所尝试的。 – Max 2014-10-29 08:46:49

+0

SELECT completedon,language,round_over.round_id,password FROM players_over,round_over WHERE(players_over.email ='1'and players_over.round_id = round_over.round_id)and TIME_TO_SEC(TIMEDIFF(NOW(),round_over.finishedon))<172800 – 2014-10-29 08:51:07

+0

除了这段代码之外,你使用什么连接字符串?如果你使用'localhost',尝试使用'127.0.0.1',这会加快我的mysql查询。 – Azrael 2014-10-29 08:58:09

回答

0

我怀疑该位:

TIME_TO_SEC(TIMEDIFF(NOW() , table2.time)) < 172800 

使得它不可能使用任何索引上table2.time作为列由函数包裹。

您可以尝试并重写它,使普通列位于左侧,右侧的所有功能内容例如

table2.time > (NOW() - 172800) 

假设time以秒为单位(这可能不是,因为你正在使用TIME_TO_SEC,但你的总体思路)。

另外....用EXPLAIN运行这个(只需将EXPLAIN一词添加到查询的前面并运行它)来查看工作的进展情况。

+0

table2.time> = DATE_SUB(NOW(),INTERVAL 2 DAY) 我已经使用过了,但查询仍然很慢 – 2014-10-29 09:56:23

+0

@Joy:你能量化“还是慢”吗?你的查询计划是什么样的?您是否获得了全表扫描或索引使用情况,但仍存在重大开销等问题? – davek 2014-10-29 10:02:02

+0

我在table2.time列上添加了一个datetime类型的索引。我可以从这个列中删除索引吗? – 2014-10-29 10:12:43