簡體   English   中英

Mysql PDO編寫語句效率

[英]Mysql PDO Prepared statement efficiency

我正在接管一個PHP應用程序,它每次運行SQL語句時都使用MySQL PDO預處理語句。 我知道,當您要對同一語句進行多次迭代時,准備SQL會更有效。

$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array(150, 'red'));
$red = $sth->fetchAll();
$sth->execute(array(175, 'yellow'));
$yellow = $sth->fetchAll();

但是,我接管的應用程序在PDO之上構建了一個層,它調用了一個常見的“執行”函數,它似乎准備了每個單獨的SQL查詢。 例如:

$query = self::$DB->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$query->execute($bindvars);

如果應用程序執行了數百或數千次“INSERT INTO ...... ON DUPLICATE KEY UPDATE”SQL語句,那么$ DB-> prepare()步驟是否每次運行都會產生很大的開銷?

非常感謝,傑森。

從文檔:

對於將使用不同參數值多次發出的語句調用PDO :: prepare()和PDOStatement :: execute(),通過允許驅動程序協商查詢計划的客戶端和/或服務器端緩存來優化應用程序的性能,元信息......

我在這里並沒有真正做出任何啟示,但“優化性能”的反面確實是“開銷”。 至於它是否重要,為什么不以任何方式運行循環並測量? 然后,您可以使用硬數據自行決定備份您的決策。

除了查詢重用之外,在PDO中使用預准備語句的主要原因是執行占位符綁定。

$query = self::$DB->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$query->execute($bindvars);

在此代碼中, $sql變量中存在的問號(或:named )占位符將替換$bindvars數組中的值。 此替換可確保正確引用和轉義變量,從而使執行SQL注入變得更加困難。

准備/執行中可能會有少量開銷,但考慮到SQL注入的風險,這一小額開銷並不算什么 唯一的另一個選擇是將SQL字符串連接在一起,這可能是一個巨大的安全風險,除非它每次都完美地完成。

以前的開發人員知道他或她在做什么,至少在這個特定的情況下,你不應該撤消他或她在這里所做的工作。 恰恰相反,您應該繼續在將來的所有代碼中使用預准備語句。

(另一方面,我無法保證MySQL的游標性能......)

如果內存服務,MySQL會看到你准備好的語句,並期望你可能正在運行一個可能多次調用同一語句的應用程序。 因此,它會緩存語句字符串,因此再次准備它並不需要太多開銷,盡管它不僅僅是在內存中保留對語句的引用。 它絕對比每次從字符串解析一個全新的查詢更好。

這只是我對我所聽到的內容的模糊記憶。 這是重要的一點:如果在同一個請求中運行這些數百或數千個插入,請考慮重構數據庫類以准備一次並在這些情況下執行多次。 了解它將產生多大差異的唯一方法是自己進行基准測試:/

暫無
暫無

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

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