2015-10-15 38 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