2013-02-28 98 views
0

我有什麼,我認爲是一個複雜的PHP MySQL查詢,從不同的Drupal表中的一個JSON格式提取數據,然後讓我輸出通過PHP的結果。有時候這個查詢速度非常快,有時候速度很慢。如果您轉到http://www.serviidb.com/content/data/view/api_access,您可以看到實際的API響應時間。數據庫中的內容一直在增長,隨着數據庫變大,這個問題只會越來越嚴重。MySQL的PHP​​的查詢有時非常快ANSD有時非常非常慢

對不起忘了添加服務器信息:我怎麼打電話查詢

Server: Localhost via UNIX socket 
Server version: 5.5.29-0ubuntu0.12.04.1-log 
Protocol version: 10 

例。

mysql_query($sqlApiAccess) or die('Error, insert query failed'); 

如果有人希望看到我使用的PHP只是問,我會發布它。我已經編程了多年,但對PHP來說是新的,所以我可能會做很長的一切。

我明白任何及所有的幫助,指導或建議,任何人都可以給我。

下面是該查詢:

SELECT DISTINCT 
    node.title AS "name", 
    regions.region AS region, 
    field_data_field_media_url.field_media_url_value AS url, 
    media_type.media_type AS mediaType, 
    repositoryType.repositoryType AS resourceType, 
    plugins.plugin, 
    media_resource_language.language, 
    node.nid, 
    resolution.resolution, 
    (field_data_field_quality.field_quality_rating/20) AS quality, 
    (field_data_field_reliability.field_reliability_rating/20) 
     AS reliability, 
    field_data_field_installs.field_installs_value AS installCount 
FROM node 
    LEFT JOIN field_data_field_region 
     ON field_data_field_region.revision_id = node.vid 
    LEFT JOIN regions 
     ON regions.tid = field_data_field_region.field_region_tid 
    LEFT JOIN field_data_field_media_url 
     ON field_data_field_media_url.revision_id = node.vid 
    LEFT JOIN field_data_field_required_plugin 
     ON field_data_field_required_plugin.revision_id = node.vid 
    LEFT JOIN field_data_field_source 
     ON field_data_field_source.revision_id = node.vid 
    LEFT JOIN repositoryType 
     ON repositoryType.tid = field_data_field_source.field_source_tid 
    LEFT JOIN plugins 
     ON plugins.tid = 
      field_data_field_required_plugin.field_required_plugin_tid 
    LEFT JOIN field_data_field_media_type 
     ON field_data_field_media_type.revision_id = node.vid 
    LEFT JOIN media_type 
     ON media_type.tid = 
      field_data_field_media_type.field_media_type_tid 
    LEFT JOIN field_data_field_language 
     ON field_data_field_language.revision_id = node.vid 
    LEFT JOIN media_resource_language 
     ON media_resource_language.tid = 
      field_data_field_language.field_language_tid 
    LEFT JOIN field_data_field_resolution 
     ON field_data_field_resolution.revision_id = node.vid 
    LEFT JOIN resolution 
     ON resolution.tid = 
      field_data_field_resolution.field_resolution_tid 
    LEFT JOIN field_data_field_quality 
     ON field_data_field_quality.revision_id = node.vid 
    LEFT JOIN field_data_field_reliability 
     ON field_data_field_reliability.revision_id = node.vid 
    LEFT JOIN field_data_field_installs 
     ON field_data_field_installs.revision_id = node.vid 
WHERE  node.status <> 0 
    AND node.type = "media" 
    AND (node.title LIKE '%%' OR plugins.plugin LIKE '%%') 
    AND node.title LIKE '%%' 
    AND plugins.plugin LIKE '%%' 
    AND media_resource_language.language LIKE '%%' 
    AND (regions.region = "worldwide" OR regions.region LIKE '%%') 
    AND media_type.media_type = "video" 

,我讀了它會導致查詢,如果「象」是用來運行緩慢,所以我在看一對夫婦的方式來去除部分,除非有實際變量中的信息。以下是我目前正在開發where部分的方式。

/** setups up sql variable for searches. 
    * 
    */ 
    $sqlregion  = ""; 
    $sqltitle   = ""; 


      $sqlregion  = 'and (regions.region = "worldwide" or '; 
      $sqlregion  = $sqlregion . 'regions.region like '; 
      $sqlregion  = $sqlregion . "'%"; 
      $sqlregion  = $sqlregion . $region; 
      $sqlregion  = $sqlregion . "%')"; 

    $slqLanguage  = "and media_resource_language.language like '%" . $language . "%'"; 
    $sqltitleOrPlugin = "and (node.title like '%" . $titleOrPlugin . "%' or plugins.plugin like '%" . $titleOrPlugin . "%')"; 

    $sqlPlugin  = "and plugins.plugin like '%" . $plugin . "%'"; 

    $sqltitle   = "and node.title like '%" . $title . "%'"; 

而Where語句的設置是這樣的。

WHERE node.status<>0 and node.type="media" . $sqltitleOrPlugin . $sqltitle .$sqlPlugin . $slqLanguage . $sqlregion; 

其中的變量實際上是第三方應用程序填充以縮小數據的參數。像這樣的語言= EN &區=我們&標題=的&客戶端=測試

WHERE node.status<>0 
    and node.type="media" 
    and (node.title like '%%' or plugins.plugin like '%%') 
    and node.title like '%%' 
    and plugins.plugin like '%%' 
    and media_resource_language.language like '%%' 
    and (regions.region = "worldwide" or regions.region like '%us%') 
    and media_type.media_type ="video" 
+0

如果你至少說過,如果你正在使用mysql_ mysqli或PDO(或別的東西)爲你的php查詢 – 2013-02-28 22:02:32

+4

'somefield LIKE'%%''是沒有意義的。基本上它會是「somefield不爲空」,但阻止索引的使用。 – 2013-02-28 22:03:00

+1

另外,如果使用相同的查詢/數據庫卷獲得不同的速度,可能是網絡或硬件問題? – 2013-02-28 22:04:32

回答

0

這是完全有可能是MySQL緩存查詢結果。首先,有通用MySQL query cache。在使用InnoDB存儲引擎時,還有InnoDB buffer pool。這兩個緩存都可以存儲SELECT查詢及其結果內存,允許非常快速的響應。

然而,當在受影響的表被更新的一個數據(這樣做是爲了確保MySQL不提供過時的結果),這些緩存通常被刷新。而且,當達到最大高速緩存大小時,通常會從高速緩存中清除不常用的結果。

你的查詢連接了很多表,幷包括DISTINCT語句,所以它可能會導致IO相當量;此外MySQL可能需要使用臨時表來建立結果(這些可能會偶爾寫入磁盤,從而導致更多的IO)。因此構建第一個結果集可能需要一段時間,而後續請求可以從查詢緩存中快速回答。當數據發生變化或緩衝區大小用盡時,緩存的結果將從緩存中清除,並且下一次調用將再次緩慢。

您可以嘗試調整緩衝池配置參數(例如,通過增加innodb_buffer_pool_size,儘管我不是這方面的專家),以便將結果保留在緩存中較長時間。