0

私は、さまざまな drupal テーブルからデータを取得し、php を介して json 形式で結果を出力できる複雑な php mysql クエリだと思うものを持っています。このクエリは非常に高速な場合もあれば、非常に遅い場合もあります。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セクションを削除する方法をいくつか検討しています。以下は、現在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;

where 変数は、実際には、サード パーティのアプリがデータを絞り込むために入力するパラメーターです。そのように language=en®ion=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"
4

1 に答える 1

0

MySQL がクエリ結果をキャッシュする可能性は十分にあります。まず、一般的なMySQL クエリ キャッシュがあります。InnoDB ストレージ エンジンを使用する場合、InnoDB バッファー プールもあります。どちらのキャッシュも SELECT クエリとその結果をメモリ内に格納できるため、非常に迅速な応答が可能になります。

ただし、これらのキャッシュは通常、影響を受けるテーブルのいずれかのデータが更新されるとフラッシュされます (これは、MySQL が古い結果を配信しないようにするために行われます)。さらに、キャッシュの最大サイズに達すると、通常、使用頻度の低い結果がキャッシュから消去されます。

クエリは非常に多くのテーブルを結合し、DISTINCTステートメントを含むため、おそらくかなりの量の IO が発生します。さらに、MySQL は結果を構築するために一時テーブルを使用する必要がある場合があります (これらはディスクに頻繁に書き込まれ、さらに多くの IO が発生する可能性があります)。そのため、最初の結果セットの作成にはおそらくかなりの時間がかかりますが、その後のリクエストにはクエリ キャッシュからすばやく応答できます。データが変更されるか、バッファ サイズが使い果たされると、キャッシュされた結果がキャッシュからフラッシュされ、次の呼び出しが再び遅くなります。

innodb_buffer_pool_size結果をより長期間キャッシュ内に保持するために、バッファー プールの構成パラメーターを調整してみてください (たとえば、私はこの専門家ではありませんが、 を増やします)。

于 2013-02-28T22:27:26.990 に答える