繁体   English   中英

MySQL超时问题

[英]MySQL time out issue

我在与Linux服务器上的PHP和MySql有关的锻炼中遇到严重问题,而在本地主机中使用相同数据库运行相同代码时,它运行正常。

以及我在数据库表中有近30,000条记录,而mysql是:

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

它在我的本地主机和Linux服务器上的INFINITE中花费0.0010秒。 我找不到原因。

谢谢卡马尔

您可以确认返回相同的结果吗? 这样应该更快。 联合有时有用,但并未真正优化。

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:我假设您有索引un oser_id和id_movie

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

MySQL优化排序在页面中查找RAND():在注释中有一些性能测试=> rand()单独接缝是一个不好的解决方案

性能

现在,让我们看看我们的表现如何。 我们有3个不同的查询来解决我们的问题。

  • Q1。 按RAND()订购
  • Q2。 RAND()* MAX(ID)
  • Q3。 RAND()* MAX(ID)+按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.081s ||| 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.607s || 0:00.614s | 0:00.628s || 0:00.637s

如您所见,普通ORDER BY RAND()已经在表中仅100行的优化查询后面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM