4 回答

TA貢獻2037條經(jīng)驗 獲得超6個贊
MySQL + PHP + Apache“一直”非常擅長“并行”運行單獨的 SQL 語句。如果單獨的用戶發(fā)出 HTTP 請求,他們自然會快速通過 Apache(可能是按順序,但很快)并到達單獨的 PHP 實例(假設 Apache 已經(jīng)配置了足夠的“孩子”)。每個 PHP 腳本都會建立自己的 MySQL 連接。MySQL 將很快接受多個連接(假設max_connections
足夠高,默認情況下)。每個 MySQL 連接都將獨立工作(使用低級數(shù)據(jù)庫鎖、互斥鎖等)。每個都將在完成時完成,對于 PHP 和 Apache 也是如此,將結(jié)果返回給用戶。
我假設(不確定)nginx 的工作方式類似。
注意:我建議 Apache(和 nginx)按順序執(zhí)行。但我懷疑將 HTTP 請求交給 PHP 需要大約一毫秒,所以這個“串行”步驟不會解釋你找到的時間。
我得出結(jié)論,其中之一并沒有真正發(fā)生:
每一步的配置都不允許 3 個孩子/連接/等,或者
有 3 個單獨的 HTTP 請求。
有 3 個單獨的 PHP 腳本。
這 3 個 SQL 語句沒有相互阻塞。(請?zhí)峁?SQL。) 注意:
ENGINE=MyISAM
使用表鎖定;僅此一項就可以解釋問題。(請?zhí)峁?code>SHOW CREATE TABLE。)
有可能(在看到 SQL 之后)加快 SQL 的速度,從而減少緩慢的整體問題。
查詢
假設id
是PRIMARY KEY
每個表的,那么這些其他索引可能有助于加快查詢 2:
backup_broadcast: (deletion, id)
shares: (media_type, media_id, site_id)
broadcast: (site_id, id)
video: (deletion, id)
playlists_playlists: (playlist_id, broadcast_id)
playlist_broadcast聞起來像“多對多映射”表。如果是這樣,我建議遵循h(huán)ttp://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table中的提示。(對于任何類似的表格也是如此。)
OR并且IN ( SELECT ... )往往是低效的結(jié)構(gòu)。但聽起來你對查詢沒有任何控制權(quán)?
那是LIMIT沒有的ORDER BY嗎??你關心你得到哪 10 行嗎?這將是不可預測的。
這么多列會發(fā)生什么?似乎每次運行查詢時它們中的大多數(shù)都是相同的,因此主要是浪費時間?
對于查詢 3,site需要INDEX(deletion, customer_id)(按任意順序)。然而,重新制定它以使用 a JOINorEXISTS可能會運行得更快。

TA貢獻1860條經(jīng)驗 獲得超9個贊
我認為您的 php 會話鎖定存在問題:您的第二個和第三個查詢正在嘗試訪問同一個 php 會話,并且正在等待。
嘗試盡快調(diào)用session_write_close
,以釋放您的 php 會話。盡快:當您確定不會在 php 會話中寫入任何數(shù)據(jù)時。
一個簡單的檢查方法是嘗試使用 2 個瀏覽器或匿名/隱身模式:您的 cookie 不會被共享,并且您應該有 2 個會話,而不是相互阻止。

TA貢獻1803條經(jīng)驗 獲得超6個贊
MySQL 可以處理大量并行查詢,但您不能在同一時間為每個連接執(zhí)行多個查詢。PHP 通常的設置方式是每個請求都轉(zhuǎn)到不同的線程/進程,因此每個進程都會有自己的 MySQL 連接,從而避免了上面提到的問題。除非您在 PHP 中使用持久連接,否則您最終可能會為每個請求使用相同的連接。如果是這種情況,應該很容易禁用它并返回到每個請求模型的標準一個數(shù)據(jù)庫連接。
我的第一個猜測是端點 2 在數(shù)據(jù)庫上觸發(fā)了一些鎖定,這就是為什么端點 3 查詢排隊直到 enpoint2 的查詢完成。這可以通過更改代碼中的邏輯(避免或最小化數(shù)據(jù)庫鎖定)或通過更改數(shù)據(jù)庫配置或用于更好地滿足應用程序需求的表引擎來解決。示例:InnoDB 使用行級鎖定,而 MyISAM 鎖定整個表鎖定。
如果您不介意配置它,分析將非常有用。如果你走這條路,我建議看看 Blackfire.io、New Relic 或 xdebug profiling。通過這種方式,您將能夠更快地找到瓶頸。

TA貢獻1878條經(jīng)驗 獲得超4個贊
嗯……評論太長了。
稍微簡化一下,每個引擎都有一個隊列,用于收集要計算的查詢,具體取決于硬件,它使用 2 個或 3 個甚至更多線程來計算每個查詢。每個查詢需要更多的線程運行更多的時間,因為鎖,就像它鎖定整個表一樣,當它插入一個具有自動增量的新行時。(你會發(fā)現(xiàn)很多關于鎖的例子)。當然,每個查詢都需要內(nèi)存和其他資源,它們必須與服務器上運行的所有計算機軟件的其余部分共享。
使用集群,您需要為管理多個 sql 服務器付出代價。
所以從 sql server 端來看,它是并行的,但是你需要硬件來支持許多線程/許多引擎(應該非常小心地使用)
當然,你可以在 sql 中擁有多個用戶,但為了方便起見,通常每個 APP 一個,有時甚至每個服務器一個。但是同一個用戶可以同時訪問數(shù)據(jù)庫,當然你可以禁用它。
您的 php 并行運行,因為 Web 服務器是為運行 papallel 請求而構(gòu)建的,并且它運行 php、Python(django) 或 javascript(nodejs) 、 apache、 IIS、 nginx 都沒有關系,還有更多,每一種技術(shù)有沒有額外的好處,并且導致您添加到引擎的更多模塊,它變得慢得多。
因此,一切都在一定程度上是平行的,您可以增加您在云提供商或虛擬服務器等中看到的此類系統(tǒng)的功能。
只有在引入 Pokemon go 或新游戲時才會注意到這些限制,即使是大型云提供商也會崩潰?;蛘呤菉W巴馬醫(yī)改的災難,沒有進行如此規(guī)模的測試,無論哪個...負責,
并行化這樣的任務是困難的,因為在 webserver 和 sqlserver 的情況下,它必須在一定程度上緩存他們經(jīng)常發(fā)出的請求,但通常每個請求都需要自己的數(shù)據(jù)。
實際上一切都要復雜得多,從具有 3 個管道、多核和共享內(nèi)存(導致 Meltdown 及其兄弟)的 cpus 開始,遍歷僅駐留在內(nèi)存中以實現(xiàn)高性能的表或數(shù)據(jù)庫或僅在緩存中運行的 Web 服務器cpus,比內(nèi)存或硬盤快得多......
- 4 回答
- 0 關注
- 189 瀏覽
添加回答
舉報