簡體   English   中英

PHP MySQL優化

[英]php mysql optimisation

我想優化我的php腳本,實際上我正在為php實現memcached(將時間從30秒減少到5秒)。 首先認為您必須看到app.promls.net上的腳本,構建該腳本大約需要3秒鍾(最后查看源代碼,隨着時間的執行,您將看到注釋框)。

接下來認為我使用解釋優化了我的選擇語句:

SELECT SQL_CALC_FOUND_ROWS p.id , p.type, p.bathrooms, p.bedrooms, p.for_sale, p.for_rent, p.rent_price, p.sale_price, p.min_price, p.mid_price, p.hig_price, p.units, p.negotiation, p.status, p.square_meters, p.commission, p.address, p.currency_type, p.creation_date, p.modified_date, p.parent, p.property_name, p.area_id, p.amenities, p.unit_number, p.levels, p.for_vacational, p.construction_year, p.construction_density, p.plot_meters, p.community_fees, p.garbage_tax, p.mortage, p.accompanied_visit, p.sale_sign, (select up.path from uploads up where up.property_id = p.id order by position asc,id asc limit 0,1) as image, p.ref_catastral, p.vacational_term, p.property_keys, p.owner_id, p.property_type , pt.name_es as category, ci.description as city, ci.id as city_id, es.description as estate, es.parent as estate_id, co.description as country, co.parent as country_id, u.id as brokerid, u.fullname as brokername, u.phone brokerphone, u.cellphone brokermobile , u.username as brokeremail, c.address as companyaddress, c.phone as companyphone, c.name as companyname, c.website companyweb, c.email companyemail, c.id as companyid FROM properties p inner join property_types pt on pt.id = p.property_type inner join areas ci on ci.id = p.area_id inner join areas es on es.id = ci.parent inner join areas co on co.id = es.parent inner join users u on u.id = p.created_by inner join company c on c.id = p.company_id where p.status in('active','active-rented','active-sold') order by p.min_price asc, p.mid_price asc, p.hig_price asc, p.rent_price asc, p.sale_price asc limit 0, 10

解釋:

> 1, 'PRIMARY', 'p', 'ALL',
> 'property_area,property_status', '',
> '', '', 142, 'Using where; Using
> temporary; Using filesort' 1,
> 'PRIMARY', 'c', 'ref', 'PRIMARY',
> 'PRIMARY', '4',
> 'inmobili.p.company_id', 1, 'Using
> where' 1, 'PRIMARY', 'pt', 'eq_ref',
> 'PRIMARY', 'PRIMARY', '4',
> 'inmobili.p.property_type', 1, 'Using
> where' 1, 'PRIMARY', 'u', 'ALL',
> 'PRIMARY', '', '', '', 4, 'Using
> where' 1, 'PRIMARY', 'ci', 'eq_ref',
> 'PRIMARY', 'PRIMARY', '4',
> 'inmobili.p.area_id', 1, '' 1,
> 'PRIMARY', 'es', 'eq_ref', 'PRIMARY',
> 'PRIMARY', '4', 'inmobili.ci.parent',
> 1, '' 1, 'PRIMARY', 'co', 'eq_ref',
> 'PRIMARY', 'PRIMARY', '4',
> 'inmobili.es.parent', 1, '' 2,
> 'DEPENDENT SUBQUERY', 'up', 'ref',
> 'property_uploads',
> 'property_uploads', '4',
> 'inmobili.p.id', 5, 'Using where;
> Using filesort'

如您所見,它從表屬性和一個臨時表中返回了142行,那是因為where具有下一個條件:

where p.status in('active','active-sold','active-rented');

因此,要修復我在p.status上實現了索引。 但是誤配是當我使用只有一個值的where時:

where p.status in('active');

它只給我返回77行,另外還包括:“在哪里使用;使用臨時文件;使用文件排序”; 如果只更改where條件,但是如果我取消了order條件,它將產生相同的77行,並另外加上:“ using where;”,所以我想知道如何使用explain和何時包含“ order”來優化mysql。 ”或“分組依據”語句。

順便說一句,我聽說使用存儲過程比從php中選擇普通存儲過程要快,但是尋找wordpress的來源不要使用過程,所以我認為使用過程不是解決方案。

我曾經想過如何將hiphop用於php,也許可以幫上忙。

我正在使用專用服務器。 php的配置必須很好,因為我有另一個子域,其加載速度比該應用程序快,腳本是相同的,但數據庫是firebird,並且我正在實現memcached和存儲過程。

您如何看待,我需要重新使用Firebird還是mysql可以解決這個問題?

非常感謝您的幫助,如果您看到我的應用需要30秒鍾才能執行我的腳本,那么我真的需要對其進行優化;

告訴我,如果您需要更多信息,我將為您提供一切! 如果願意,可以通過msn或skype聊天。

提前致謝

告訴我是否需要更多信息

首先,我認為您應該向我們提供您的架構(域)。 我認為您應該使用sql2diagram之類的工具為我們提供圖像。 也許您應該先優化您的架構

實際上我正在為PHP實現memcached(將時間從30秒減少到5秒)

首先,我想知道從memcached(MEMORY)獲取數據要花這么長時間。 從memcached獲取數據完全不需要花費任何時間。 我也想知道您是否需要使緩存無效很多,或者這是一次查詢。 因為在這種情況下,您需要執行另一個MySQL才能將新數據放入緩存中。 如果可能的話,我認為您應該事先使用消息隊列(例如redis (我也將redis用作我的數據存儲))或beantalkd離線進行此操作 這將使您的網站再次快速。

我曾經想過如何將hiphop用於php,也許可以幫上忙。

它可以幫助您減少CPU使用率,從而可以省錢。 但是,如果您的查詢現在像現在一樣糟糕,我想即使是嘻哈也不會削減它

我需要回到firebird還是mysql可以解決這個問題?

MySQL應該可以管理它,但是我發現您的查詢確實很復雜。 我認為您執行的聯接過多(您也應該重新格式化查詢,因為它很難閱讀)。 您應該像說的那樣優化它。 過去,您需要進行數據庫規范化 現在,我認為您應該使用更多的內存和磁盤空間來避免JOINING( 昂貴! )表 之后,您應該通過setcut和predicate表示法計算SQL 我從大學獲得的論文過去曾讓我感到痛苦,但是我的確取得了很好的成績。

但老實說,我已經很長時間沒有使用SQL了,因為現在我真的迷上了Redis ,它快如閃電 我認為在redis之上實施此操作會容易得多。

暫無
暫無

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

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