簡體   English   中英

什么更快; 包括另一個文件或在PHP中查詢MySQL數據庫?

[英]What's quicker; including another file or querying a MySQL database in PHP?

在PHP中,它更快; 使用include('somefile.php')或使用簡單的SELECT查詢查詢MySQL數據庫以獲取相同的信息?

例如,假設您有一個JavaScript自動填充搜索字段,需要3,000個術語才能匹配。 使用include從另一個文件讀取這些術語是否更快或使用簡單的SELECT查詢從MySQL數據庫中讀取它們?

編輯:這假設我想要包含的數據庫和文件與我的代碼在同一台本地機器上。

這取決於。 如果您的文件存儲在服務器本地,並且數據庫安裝在另一台計算機上,則包含該文件的速度越快。

Buuuuut,因為它取決於你的系統,它可能不是真的。 我建議你制作一個PHP測試腳本並從命令行運行100次,然后通過HTTP重復測試(使用cURL)

例:

use_include.php

<?php

  start = microtime(true);

  include( 'somefile.php' );

  echo microtime(true)-start;

?>

use_myphp.php

<?php

  start = microtime(true);

  __put_here_your_mysql_statements_to_retrieve_the_file__

  echo microtime(true)-start;

?>

包含文件應該幾乎總是更快。 如果您的數據庫位於另一台計算機上(例如,在共享主機中)或多服務器設置中,則查找將需要進行額外的躍點。

然而,在實踐中,差異可能並不重要。 如果列表是動態的,那么將其存儲在MySQL中將使您的生活更輕松。 靜態列表(例如國家或州)可以存儲在PHP包含中。 如果列表很短(幾百個條目)並且經常使用,你可以將它直接加載到JavaScript中並取消AJAX。

如果您要使用MySQL路由並擔心速度,請使用緩存。

$query = $_GET['query'];
$key = 'query' . $query;
if (!$results = apc_fetch($key))
{ 
    $statement = $db->prepare("SELECT name FROM list WHERE name LIKE :query");
    $statement->bindValue(':query', "$query%");
    $statement->execute();
    $results = $statement->fetchAll();
    apc_store($key, $results);
}

echo json_encode($results);

時間的差異更多地取決於系統設計,而不是我敢說的基礎技術。 MySQL結果和文件都可以緩存在內存中,而那里的性能差異很小,可以忽略不計。

相反,我會問自己維護的差異是什么。 您是否可能更改數據? 如果沒有,只需將其彈出一個普通文件即可。 您是否可能經常更改內容的位? 如果是這樣,數據庫更容易操作。 對於數據結構也是如此,如果需要“重組”,將數據放入數據庫可能更有效率嗎?

所以:做你認為最方便的代碼和數據的未來維護者。 :-)

很難/不可能給出一個確切的答案,因為有太多的未知變量 - 如果文件系統安裝在位於世界另一端的NFS上會怎么樣? 或者你有整個MySQL數據庫在內存中。 還應考慮數據庫的大小。

但是,在一個更回答的問題上, 一個安全的猜測是MySQL會更快 ,給出好的索引,良好的數據庫結構/規范化,而不是太花哨/復雜的查詢。 I / O操作總是很昂貴(讀取:慢),而如前所述,整個數據集已經被MySQL緩存在內存中。

此外,我想你想用這些包含的文件進行進一步的字符串操作,這會讓事情變得更加麻煩 - 我確信MySQL的字符串搜索算法比你在PHP中提出的要好得多。

如果這是你定期獲取的東西,那么預取數據(從磁盤或數據庫,無關緊要)可能是值得的,並讓你的腳本從像RAMcached這樣的RAM緩存中提取它。

肯定包括只要文件不是太大而你最終使用太多內存,在這種情況下建議使用數據庫

從文件中讀取原始數據到腳本通常比從數據庫中讀取更快。

但是,聽起來您想要查詢該數據以便找到匹配以返回到javascript。 在這種情況下,您可能會發現MySQL對於數據的實際查詢/搜索會更快(特別是如果正確索引等),因為這是數據庫擅長的。

讀取大文件的可伸縮性也較低,因為在腳本執行時將使用大量服務器內存。

為什么不兩種方式做,看哪哪個更快? 這兩種解決方案都非常簡單。

如果您希望術語的數量在以后變得更大,那么最好將MySQL與全文搜索字段一起使用。

我最近有這個問題。 我在mysql中有一些數據,我在每個頁面請求時查詢。 對於我的數據集,編寫固定記錄長度文件比使用MySQL更快。

有幾個不同的因素使我的文件比MySQL更快:

  1. 文件大小很小 - 低於100kb的文本數據
  2. 我隨機挑選而不是搜索 - 索引沒有任何區別
  3. 連接時間 - 打開文件並將其讀入比在服務器負載較高時連接到數據庫更快。 由於操作系統將文件緩存在內存中,因此尤其如此

最重要的是我對它進行了基准測試並比較了結果。 對於我的工作負載,文件系統更快。 我懷疑如果我的數據集增長,那將會改變。 我將密切關注性能,並且我已准備好改變其未來的工作方式。

如果你使用像APC或Xcache這樣的PHP字節碼緩存,包括文件可能會更快。 如果您正在使用PHP並且想要性能,則絕​​對需要字節碼緩存。

聽起來您正在考慮在您包含的PHP腳本中保留靜態數據,以避免命中數據庫。 你基本上做了一個基本的緩存。 這可以正常工作,只要您有一些方法來刷新該文件,如果/當數據確實發生變化時。 您可能還希望了解MySQL查詢緩存,以便更快地對靜態數據進行SQL查詢。 或者Memcached用於將靜態數據保存在內存中。

我完全不知道,但在我的意見中使用MySQL,即使速度較慢,如果內容是動態的,也可以使用。 但是我很確定它對於大內容來說更快,使用include。

暫無
暫無

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

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