![](/img/trans.png)
[英]Object Orientated Design with Databases and scalability/optimisation using PHP and 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.