![](/img/trans.png)
[英]Log to file via PHP or log to MySQL database - which is quicker?
[英]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更快:
最重要的是我對它進行了基准測試並比較了結果。 對於我的工作負載,文件系統更快。 我懷疑如果我的數據集增長,那將會改變。 我將密切關注性能,並且我已准備好改變其未來的工作方式。
如果你使用像APC或Xcache這樣的PHP字節碼緩存,包括文件可能會更快。 如果您正在使用PHP並且想要性能,則絕對需要字節碼緩存。
聽起來您正在考慮在您包含的PHP腳本中保留靜態數據,以避免命中數據庫。 你基本上做了一個基本的緩存。 這可以正常工作,只要您有一些方法來刷新該文件,如果/當數據確實發生變化時。 您可能還希望了解MySQL查詢緩存,以便更快地對靜態數據進行SQL查詢。 或者Memcached用於將靜態數據保存在內存中。
我完全不知道,但在我的意見中使用MySQL,即使速度較慢,如果內容是動態的,也可以使用。 但是我很確定它對於大內容來說更快,使用include。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.