2015-10-15 34 views
0

我现在面临严重的问题,在我的锻炼,而正在运行相同的代码与本地主机相同的数据库时,它的正常工作与PHP和MySQL Linux服务器上。MySQL的超时问题

除了我在数据库中的表和MySQL差不多30000条记录是:

SELECT * FROM tbl_movies where id not in (select movie_id from tbl_usermovieque where user_id='3' union 
             select movie_id from tbl_user_movie_response where user_id='3' union 
             select movie_id from tbl_user_movie_fav where user_id='3') and id < 220 order by rand() limit 0,20 

其采取在我的本地0.0010秒和无限我们的Linux服务器上。我无法找到原因。

感谢 卡迈勒

+0

你有你的表有正确的'indexes'? –

+0

你用php标记了这个问题,但只给我们一个SQL语句 - 你是否尝试过SQL命令行上的语句或像phpmyadmin这样的数据库工具?也许它不是SQL语句是缓慢的,但有你的PHP脚本,并链接编辑通过优化订购 – cypherabe

回答

1

,你能否证实这个返回相同的结果?这样应该会更快。联盟有时是有用的,但并未真正优化。

SELECT * FROM tbl_movies where id not in (
    select distinct movie_id 
    from tbl_movies m 
    inner join tbl_usermovieque um ON um.movie_id = m.movie_id = m.movie_id 
    inner join tbl_user_movie_response umr ON umr.movie_id = m.movie_id = m.movie_id 
    inner join tbl_user_movie_fav umf ON umf.movie_id = m.movie_id = m.movie_id 
    where um.user_id = 3 or umr.user_id = 3 or umf.user_id = 3 
) and id < 220 order by rand() limit 0,20; 

PS:我假设你有指标未oser_id和id_movie

编辑:你的问题可能来自rand()

MySQL order by optimization查找RAND()的页面:在注释也有一些性能测试=>兰特()单独接缝是一个坏的溶液

性能

现在让我们来看看我们的表现会发生什么。我们有3个不同的 查询解决我们的问题。

  • Q1。 ORDER BY RAND()
  • Q2。 RAND()* MAX(ID)
  • Q3。 RAND()* MAX(ID)+订单编号

Q1预计花费N * log2(N),Q2和Q3几乎是常数。

将获得真正的价值,我们有N行(单万到 一百万)和执行的每个查询1000次填的表格。

行|| || 100 1.000 || || 10.000 100.000 || 1.000.000

Q1 || 0:00.718s || 0:02.092s || 0:18.684s || 2:59.081小号|| 58:20.000s Q2 || 0:00.519s || 0:00.607s || 0:00.614s || 0:00.628s || 0:00.637s Q3 || 0:00.570s || 0 :00.60s || 0:00.614s | 0:00.628s || 0:00.637s

正如您所看到的,ORDER BY RAND()在表格中只有100行时已经在 优化查询之后。

+0

之间的通信问题。 – ThinkTank

+0

感谢,为您详细介绍回答,但它不是我的情况在SQL Server – Hindu