久久久久国产精品www,综合久久无码,亚洲精品99久久久久中文字幕,无码伊人网Apdm

SQL查詢優(yōu)化技術(shù)提高網(wǎng)站訪問速度
瀏覽:207 時間:2023-10-16

您必須知道用戶可以喜歡快速訪問的網(wǎng)站,可以幫助網(wǎng)站提高Google的排名,并可以幫助網(wǎng)站提高轉(zhuǎn)化率。如果您已經(jīng)看過有關(guān)網(wǎng)站性能優(yōu)化的文章,例如設(shè)置服務(wù)器的最佳實現(xiàn),殺死慢速代碼以及使用CDN加載圖像,您認為您的WordPress網(wǎng)站足夠快。但情況確實如此嗎?

使用動態(tài)數(shù)據(jù)庫驅(qū)動的網(wǎng)站(如WordPress),您的網(wǎng)站可能仍然存在需要解決的問題:數(shù)據(jù)庫查詢會降低網(wǎng)站訪問速度。

在本文中,我將向您展示如何識別導致性能問題的查詢,如何找出它們的位置,以及如何快速修復它們以及其他加速查詢的方法。我將使用門戶網(wǎng)站deliciousbrains.com上的情況來降低查詢速度作為一個實際案例。

 定位

處理慢速SQL查詢的第一步是查找慢查詢。 Ashley已經(jīng)贊揚了之前博客中的調(diào)試插件Query Monitor,而插件的數(shù)據(jù)庫查詢功能使其成為查找慢速SQL查詢的有用工具。該插件在所有頁面請求期間報告數(shù)據(jù)庫請求,并可以通過調(diào)用這些查詢代碼或原始(插件,主題,WordPress核心)來過濾這些查詢,突出顯示重復和慢速查詢。

如果您不愿意在生產(chǎn)環(huán)境中安裝插件(出于性能開銷的原因),您還可以打開MySQL慢查詢?nèi)罩?,以便記錄在特定時間執(zhí)行的所有查詢。這種存儲查詢位置的配置和設(shè)置方法相對簡單。由于這是服務(wù)級別調(diào)整,因此性能影響將小于使用調(diào)試插件,但應在不使用時關(guān)閉。

理解

一旦找到了一個價格合理的查詢,下一步就是嘗試理解它并找出導致查詢速度變慢的原因。最近,當我們開發(fā)網(wǎng)站時,我們發(fā)現(xiàn)了一個需要8秒鐘才能執(zhí)行的查詢。

我們使用WooCommerce和WooCommerce軟件插件的自定義版本來運行我們的插件商店。此查詢的目的是為我們知道客戶編號的客戶獲取所有訂閱。 WooCommerce是一種稍微復雜的數(shù)據(jù)模型。即使訂單存儲在自定義類型中,用戶的ID(商店為每個用戶創(chuàng)建的WordPress)也不會存儲在post_author中,而是作為后期數(shù)據(jù)的一部分。訂閱軟件插件創(chuàng)建一對指向自描述表的鏈接。讓我們深入了解一下查詢。

 MySQL是你的朋友

MySQL有一個非常方便的語句DESCRIBE,它可以輸出有關(guān)表結(jié)構(gòu)的信息,例如字段名,數(shù)據(jù)類型等。所以,當你執(zhí)行DESCRIBE wp_postmeta時;您將看到以下結(jié)果:

您可能已經(jīng)知道這個陳述。但是你知道DESCRIBE語句可以在SELECT,INSERT,UPDATE,REPLACE和DELETE語句之前使用嗎?更為熟悉的是他的同義詞EXPLAIN,并將提供有關(guān)如何執(zhí)行語句的詳細信息。

這是我們查詢的結(jié)果:

乍一看,這很難解釋。幸運的是,人們總結(jié)了一個通過SitePoint理解句子的綜合指南。

最重要的字段是type,它描述了表的構(gòu)造方式。如果要查看所有內(nèi)容,則意味著MySQL從內(nèi)存中讀取整個表,提高I/O的速度并將其加載到CPU上。這被稱為“全桌瀏覽”” —稍后將詳細描述。

rows字段也是一個很好的標識符,用于標識MySQL必須執(zhí)行的操作,并顯示在結(jié)果中找到了多少行。

解釋還為我們提供了許多可以優(yōu)化的信息。例如,pm2表((wp_postmeta)告訴我們使用filesort,因為我們使用ORDER BY語句對結(jié)果進行排序。如果我們想要對查詢結(jié)果進行分組,這將增加執(zhí)行的開銷。

可視化研究

對于這種類型的研究,MySQL Workbench是另一種方便,免費的工具。使用MySQL 5.6及更高版本打開數(shù)據(jù)庫,EXPLAIN的結(jié)果可以以JSON格式輸出,MySQL Workbench將JSON轉(zhuǎn)換為可視化執(zhí)行語句:

它會自動提醒用戶注意查詢的問題。我們可以立即看到連接wp_woocommerce_software_licences(別名l)的表存在嚴重問題。

  解決

您應該避免對所有表瀏覽進行此類查詢,因為他使用非索引字段order_id連接到wp_woocommerce_software_licences表和wp_posts表。這是慢查詢的常見問題,也是一個相對容易解決的問題。

 索引

Order_id是表中非常重要的標志性數(shù)據(jù)。如果要以這種方式查詢,我們需要在列上創(chuàng)建索引。此外,MySQL將逐字掃描表格的每一行,直到找到我們想要的內(nèi)容。行為已停止。讓我們添加一個索引,看看它是如何工作的:

CREATE INDEX order_id ON wp_woocommerce_software_licences(order_id)

哇,真漂亮!我們成功添加了索引并將查詢時間縮短了5秒。

  了解你的查詢語句

檢查下面的查詢——查看每個連接,每個子查詢。他們做了他們不該做的事情?你能在這里優(yōu)化嗎?

在此示例中,我們通過order_id連接licenses表和posts表,并將post類型限制為shop_order。這是為了確保我們僅通過維護數(shù)據(jù)的完整性來使用正確的訂單記錄,但實際上這在查詢中是多余的。我們知道這是一個安全的賭注。 posts表中的軟件許可證行通過order_id與WooCommerce訂單相關(guān)聯(lián),這在PHP插件代碼中是必需的。讓我們刪除聯(lián)接以查看是否有任何改進:

促銷不是太大,但現(xiàn)在查詢時間不到3秒。

 緩存一切數(shù)據(jù)

如果您的服務(wù)器默認不使用MySQL查詢緩存,則應啟用緩存。打開緩存意味著MySQL將保存所有語句和語句執(zhí)行的結(jié)果。如果有一個與緩存中的語句完全相同的語句,MySQL將返回緩存的結(jié)果。緩存不會過時,因為MySQL會在更新表數(shù)據(jù)后刷新緩存。

查詢監(jiān)視器發(fā)現(xiàn)我們的查詢語句在加載頁面時執(zhí)行了四次。雖然MySQL查詢緩存很好,但應該完全避免在一個請求中重復讀取數(shù)據(jù)庫數(shù)據(jù)。 PHP代碼中的靜態(tài)緩存很簡單,可以非常有效地解決這個問題?;旧?,第一次從數(shù)據(jù)庫中檢索請求并將其存儲在類的靜態(tài)屬性中時,后續(xù)的查詢語句將返回靜態(tài)屬性的結(jié)果:

WC_Software_Subscription {

受保護的靜態(tài)$ subscriptions=array();

公共靜態(tài)函數(shù)get_user_subscriptions($ user_id){

if(isset(static:: $ subscriptions [$ user_id])){

返回靜態(tài):: $ subscriptions [$ user_id];

}

全球$ wpdb;

$ sql='...';

$ results=$ wpdb-> get_results($ sql,ARRAY_A);

靜態(tài):: $ subscriptions [$ user_id]=$ results;

返回$ results;

}

}

緩存具有生命周期,特別是實例化對象具有生命周期。如果要查看跨請求的查詢結(jié)果,則需要實現(xiàn)持久對象緩存。但是,您的代碼應負責設(shè)置緩存并在基礎(chǔ)數(shù)據(jù)更改時使緩存無效。

 跳出箱子外思考

除了調(diào)整查詢或添加索引之外,還有其他方法可以加快查詢的執(zhí)行速度。我們查詢中最慢的部分是從客戶ID到產(chǎn)品ID到連接表單的工作,我們必須為每個客戶執(zhí)行此操作。我們可以在需要時獲取客戶的數(shù)據(jù)嗎?如果是這樣,那么我們只需要加入一次。

您可以創(chuàng)建數(shù)據(jù)表來存儲許可證數(shù)據(jù),以及所有許可的用戶ID和產(chǎn)品標識符,以對特定客戶的數(shù)據(jù)進行非規(guī)范化(非規(guī)范化)和查詢。您需要在INSERT/UPDATE/DELETE上使用MySQL觸發(fā)器來重建表(盡管這取決于更改表的數(shù)據(jù)),這將顯著提高查詢數(shù)據(jù)的性能。

類似地,如果某些連接減慢了MySQL中的查詢速度,將查詢分解為兩個或多個語句并在PHP中單獨執(zhí)行它們?nèi)缓笫占⑦^濾代碼中的結(jié)果可能會更快。 Laravel通過預加載在Eloquent中做了類似的事情。

如果您有大量數(shù)據(jù)和許多不同的自定義帖子類型,WordPress可能會減慢wp_posts表上的查詢速度。如果您發(fā)現(xiàn)查詢的帖子類型很慢,請考慮從自定義帖子類型的存儲模型移動到自定義表格 - 稍后的文章將介紹更多內(nèi)容。