簡體   English   中英

如何加快Mysql和PHP的速度?

[英]how to speed up Mysql and PHP?

我正在使用PHP和mysql在我的localhst中開發一個腳本,我正在處理大數據(大約有2百萬條用於科學研究的記錄)

我需要在生活中調用一些查詢(分析數據並准備一些數據); 但是例如需要很長時間:現在我的腳本正在分析一些數據超過4個小時

我知道我的數據庫優化可能會有一些問題我不是專家

例如,我只是發現“索引”對於加速查詢很有用,但即使索引某些列我的腳本仍然很慢

任何想法如何加快我的腳本(在PHP和MySQL中)

我使用XAMPP作為服務器包

非常感謝您的幫助

最好的祝福

更新1:

我的慢速腳本的一部分需要4個多小時來處理

$sql = "select * from urls";//10,000 record of cached HTML documents
$result = $DB->query($sql);
while($row = $DB->fetch_array($result)){
$url_id = $row["id"];
$content = $row["content"];

$dom = new DOMDocument();
@$dom->loadHTML($content);
$xpath = new DOMXPath($dom);
$row = $xpath->evaluate("/html/body//a");

for($i = 0; $i < $row->length; $i++) {
     // lots of the code here to deal with the HTML documents and some update and insert and select queries which query another table which has 1 million record
}

更新2:

我的quires中沒有“JOIN”甚至“IN”

它們是非常簡單的查詢

而且不知道! 我不知道怎么知道導致緩慢的原因是什么?

是PHP還是MYSQL?

首先,為了能夠有效地進行優化,您需要知道花費時間:

  • PHP做了太多的計算?
  • 你有太多的SQL查詢嗎?
  • 你有SQL查詢需要花費太多時間嗎?
    • 如果是的話,哪些?
  • 你的腳本在哪里花費時間?

有了這些信息,您可以嘗試弄清楚:

  • 如果你可以減少SQL查詢的數量
    • 例如,如果你一遍又一遍地做同樣的查詢,你顯然是在浪費時間
    • 另一個想法是“重新組合”查詢,如果可能的話; 例如,只使用一個查詢來獲得10行,而不是10個查詢都獲得一行。
  • 如果您可以優化花費太長時間的查詢
    • 使用索引 - 那些有用的索引通常取決於您使用的連接和條件
    • 或重寫問題,如果他們是“壞”
    • 關於select語句的優化,你可以看一下: 7.2。 優化SELECT和其他語句
  • 如果PHP進行了太多計算,你可以減少計算嗎?
    • 也許不會一次又一次地重新計算類似的東西?
    • 或者使用更有效的查詢?
  • 如果PHP花費時間,並且SQL服務器沒有過載,使用並行性(同時啟動多個計算)也可能有助於加快整個過程。

仍然:這是一個非常具體的問題,答案可能也非常具體 - 這意味着如果你想要的不僅僅是一般性答案,那么可能需要更多的信息.​​.....


編輯后進行編輯

因為你只有簡單的查詢,事情可能會更容易......也許吧。

  • 首先:您需要確定您正在進行的查詢類型。
    • 我猜,在你所有的查詢中,你可以識別一些“類型”的查詢。
    • 例如:“ select * from a where x = 12 ”和“ select * from a where x = 14 ”屬於同一類型:same select,same table,same where clause - 只有值更改
  • 一旦您知道哪些查詢被最多使用,您就需要檢查它們是否已經過優化:使用EXPLAIN會有所幫助
    • (如果需要,我確信有些人能夠幫助你理解它的輸出,如果你提供它與你的數據庫(表+索引)一起提供)
    • 如果需要:創建正確的索引 - 這是一種硬/特定部分^^
    • 對於那些減少查詢數量的查詢也可能有用......
  • 當你完成經常使用的查詢時,是時候進行花費太長時間的查詢了; 使用PHP中的microtime將幫助您找出那些是什么
    • 另一個解決方案是使用5.2.4。 慢查詢日志
    • 當您識別出這些查詢時,與之前相同:優化。


在此之前,要了解PHP是否工作太多,或者它是否是MySQL,一種簡單的方法是在Linux上使用“top”命令,或者“進程管理器” (我不在Windows上,而不是在英語中使用它 - 真實姓名可能是其他的東西)

如果PHP正在吃100%的CPU,那么你就有罪魁禍首。 如果MySQL正在吃掉所有的CPU,你也有罪魁禍首。

當你知道哪一個工作太多時,這是第一步:你先知道要優化什么。


我從你的部分代碼中看到你是:

  • 逐個瀏覽10,000個元素 - 應該很容易將它們分成2個或更多個切片
  • 使用DOM和XPath,這可能會占用PHP端的一些CPU

如果你有一個多核CPU,一個想法(我會嘗試,如果我看到PHP正在吃大量的CPU)將並行化。

例如,您可以同時運行兩個PHP腳本實例:

  • 一個將處理前半部分的URL
    • 這個的SQL查詢就像“ select * from urls where id < 5000
  • 另一個將處理URL的后半部分
    • 它的查詢類似於“ select * from urls where id >= 5000

您將在網絡上獲得更多並發(可能不是問題)和數據庫(數據庫知道如何處理並發,並且使用它的2個腳本通常不會太多) ,但您將能夠在同一時間處理幾乎兩倍於相同數量的文檔。

如果你有4個CPU,將urls-list分成4個(甚至更多;通過反復試驗找出)部分也會這樣做。

由於您的查詢位於一個表上且沒有分組或排序,因此查詢不太可能很慢。 我希望問題是內容字段的大小和數量。 您似乎將整個網頁的HTML存儲在數據庫中,然后每次要更改頁面上的幾個值時將其拉出。 如果可能的話,這是應該避免的情況。

大多數科學網絡應用程序(例如BLAST)都可以選擇將數據導出為分隔文本文件,如csv。 如果是這種情況,您可以考慮重構您的url表,以便在csv中每個數據字段有一列。 然后您的更新查詢將顯着加快,因為您將能夠完全在SQL中執行它們,而不是將整個url表拉入PHP,訪問和拉取每個URL記錄的一個或多個其他記錄,然后更新表。


可能您已將數據存儲為網頁,因此您可以輕松地將內容轉儲到瀏覽器。 如果您按照我的建議更改數據庫架構,則需要編寫一個網頁模板,您可以在希望輸出數據時將其插入。

了解查詢和表結構會更容易。

如果你不能給它們檢查你是否有IN操作員。 MySQL在那里往往會放慢太多。 也試着跑

EXPLAIN yourquery;

並看看它是如何執行的。 有時排序需要花費太多時間。 盡量避免在非索引列上進行排序。

內連接比左連接或右連接更快

總是加快我的查詢,並專門考慮連接。

看看你的mysql配置中可以關閉的設置等

如果您不使用索引,則可能是主要問題。 還有更多優化提示和技巧。 更好的是顯示你最慢的查詢。 沒有任何輸入數據就無法提供幫助。 索引和正確的連接可以加快速度。

如果查詢將返回相同的數據,您可以將它們存儲在文件或內存中,並只執行一次。

2百萬條記錄並不多。

在優化之前,您需要找出瓶頸所在。 您是否可以在較小的數據集上運行腳本以進行測試?

在這種情況下,您應該設置這樣的測試,然后分析代碼。 你可以使用像Xdebug這樣的專用探查器,或者如果你覺得配置太令人生畏(真的沒那么復雜,但你聽起來已經有點深入了),你可能會對手冊感覺更舒服做法。 這意味着在部分代碼之前啟動計時器並在之后停止,然后打印結果。 然后,您可以縮小哪個部分最慢。

一旦你得到了,我們可以提供更具體的答案,或者你可能會明白該做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM