簡體   English   中英

mysql php查詢有時非常快ansd有時有時非常慢

[英]mysql php query sometimes very fast ansd sometimes very very slow

我認為我是一個復雜的php mysql查詢,它從各種drupal表中提取數據,並允許我以json格式通過php輸出結果。 有時此查詢非常快,有時卻非常慢。 如果您轉到http://www.serviidb.com/content/data/view/api_access ,則可以看到實際的API響應時間。 數據庫中的內容一直在增長,並且隨着數據庫的擴大,這個問題只會變得越來越嚴重。

抱歉,忘記添加服務器信息:

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"

我讀到,如果使用“ Like”,它將導致查詢運行緩慢,因此,我正在尋找幾種方法來刪除Like部分,除非實際變量中沒有信息。 以下是我目前在哪里開發部分的方式。

/** 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;

where變量實際上是第三方應用程序填充以縮小數據范圍的參數。 像這樣language = en&region = us&title = the&client = test

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"

MySQL完全有可能緩存您的查詢結果。 首先,有通用的MySQL查詢緩存 使用InnoDB存儲引擎時,還有InnoDB緩沖池 兩個緩存都能夠將SELECT查詢及其結果存儲在內存中,從而實現快速響應。

但是,更新其中一個受影響的表中的數據時,通常會刷新這些緩存(這樣做是為了確保MySQL不會傳遞過時的結果)。 此外,當達到最大高速緩存大小時,通常會從高速緩存中清除不常用的結果。

您的查詢連接了很多表,並包含DISTINCT語句,因此可能會導致大量的IO。 此外,MySQL可能需要使用臨時表來生成結果(這些表可能偶爾寫入磁盤,從而導致更多的IO)。 因此,構建第一個結果集可能需要花費一些時間,而隨后的請求可以從查詢緩存中快速得到答復。 當數據更改或緩沖區大小用盡時,將從緩存中清除緩存的結果,並且下一次調用將再次變慢。

您可以嘗試調整緩沖池配置參數(例如,通過增加innodb_buffer_pool_size ,盡管我並不是真正的專家),以便將結果保留在緩存中更長的時間。

暫無
暫無

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

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