0

次の問題は私に頭痛を与えています。

「クエリチャッシング」を使用するようにMySQLサーバーを設定しました。

set global query_cache_size = 10000000;

の出力が

SHOW STATUS LIKE 'Qcache%';  

以下のとおりであります

+-------------------------+----------+    
|    Variable_name        | Value    |           
+-------------------------+----------+     
| Qcache_free_blocks      | 1        |
| Qcache_free_memory      | 47223976 |
| Qcache_hits             | 6709     |                                       
| Qcache_inserts          | 2314     |                                    
| Qcache_lowmem_prunes    | 0        |                                  
| Qcache_not_cached       | 365      |                                  
| Qcache_queries_in_cache | 441      |                                   
| Qcache_total_blocks     | 960      |                                     
+-------------------------+----------+ 

ただし、次の(複雑なクエリ、内部選択など)はキャッシュされません。

このクエリのデータを取得するには、常に少なくとも0.8秒かかります。このクエリの結果をキャッシュに保存するためにmysqlを使用するにはどうすればよいですか?

私は内側の選択を削除しようとしましたが、これは違いを生みませんでした。

SELECT p.id
   AS
   project_id,
   p.code
   AS project_code,
   p.title
   AS project_title,
   p.start_date
   AS project_start_date,
   p.end_date
   AS project_end_date,
   p.modf
   AS project_modf,
   ( p.budget * (SELECT 1 / r.VALUE
                 FROM   exchange_rates r
                 WHERE  r.class_currency_id = p.class_budget_currency_id) )
   AS
   project_budget,
   (SELECT z.txt
    FROM   sys_labels z
    WHERE  z.id = ps.value_label_id
           AND z.lng = 'en')
   AS project_status,
   (SELECT z.txt
    FROM   sys_labels z
    WHERE  z.id = ps.data_label_id
           AND z.lng = 'en')
   AS project_color,
   GROUP_CONCAT(DISTINCT pt.class_topic_id)
   AS projects_thematic_area_ids,
   u.id
   AS project_owner_id
FROM   projects AS p
   LEFT JOIN projects_thematic_areas AS pt
     ON pt.project_id = p.id
   LEFT JOIN sys_users AS u
     ON u.id = p.owner_uid
   LEFT JOIN class_data s
     ON s.id = p.class_status_id
   LEFT JOIN class_data AS ps
     ON ps.id = s.id
   LEFT JOIN sys_labels AS prdz1
     ON prdz1.id = prd.value_label_id
        AND prdz1.lng = 'en'
   LEFT JOIN sys_labels AS prdz2
     ON prdz2.id = prd.data_label_id
        AND prdz2.lng = 'en'
   LEFT JOIN projects_locations AS pl
     ON pl.project_id = p.id
   LEFT JOIN class_data AS l
     ON l.id = pl.class_location_id
   LEFT JOIN class_data AS r
     ON r._lft <= l._lft
        AND r._rgt >= l._rgt
        AND r._level = 1
        AND r.class_id = 5
   LEFT JOIN class_data AS c
     ON c._lft <= l._lft
        AND c._rgt >= l._rgt
        AND c._level = 2
        AND c.class_id = 10
   LEFT JOIN projects_donors AS pd
     ON pd.project_id = p.id
   LEFT JOIN institutions AS i
     ON pd.inst_id = i.id
   LEFT JOIN class_data AS ic
     ON ic.id = i.class_country_id
   LEFT JOIN projects_deliverables AS d
     ON d.project_id = p.id
WHERE  1 = 1
   AND p.is_del = "f"
   AND p.is_active = "t"
GROUP  BY p.id
ORDER  BY p.modf DESC,
      p.code DESC 

どんな助けも認められた…。

よろしく

J。

4

3 に答える 3

1

以前の回答に加えて、選択したテーブルのいずれかに変更がある場合、クエリがそこにある場合でも、クエリキャッシュは使用されません。

しかし、それらのテーブルから何も選択していないのに、なぜそれらのテーブルをすべて結合するのでしょうか? また、参加できる場合は、おそらく何も選択しないでください。

このようなものは、まったく同じものを選択します:

SELECT
   p.id AS project_id,
   p.code AS project_code,
   p.title AS project_title,
   p.start_date AS project_start_date,
   p.end_date AS project_end_date,
   p.modf AS project_modf,
   p.budget * (1 / r.VALUE) AS project_budget,
   z1.txt AS project_status,
   z2.txt AS project_color,
   GROUP_CONCAT(DISTINCT pt.class_topic_id) AS projects_thematic_area_ids,
   u.id AS project_owner_id
FROM
   projects AS p
   LEFT JOIN projects_thematic_areas AS pt ON pt.project_id = p.id
   LEFT JOIN sys_users AS u ON u.id = p.owner_uid
   LEFT JOIN exchange_rates AS r ON r.class_currency_id = p.class_budget_currency_id
   LEFT JOIN class_data s ON s.id = p.class_status_id
   LEFT JOIN class_data AS ps ON ps.id = s.id
   LEFT JOIN sys_labels AS z1 ON z1.id = ps.value_label_id AND z1.lng = 'en'
   LEFT JOIN sys_labels AS z2 ON z2.id = ps.data_label_id AND z2.lng = 'en'
WHERE
   1
   AND p.is_del = "f"
   AND p.is_active = "t"
GROUP  BY
   p.id
ORDER  BY
   p.modf DESC,
   p.code DESC 

もちろん、フィールドとグループフィールドのすべての外部キーに(結合された)インデックスがあります。ブール値に tinyint または enum フィールドを使用することを検討してください。GROUP BY を失う可能性があるため、その GROUP_CONCAT を選択しないことを検討することもできます。また、関係が存在することが確実な場合は、おそらく LEFT JOIN の代わりに INNER JOIN を使用します。

于 2010-12-09T16:19:09.367 に答える
0

あなたは試すことができますSELECT SQL_CACHE ... FROM ...

于 2010-12-09T16:06:04.533 に答える
0

あなたが試すことができるいくつかの基本的なこと:

  • クエリ キャッシュのドキュメントを読んで、基本を理解し、正しくセットアップしてください。
  • 理想的には、MySQL データベース サーバーを分離して、与えられたコマンドのみを実行するようにします。これができない場合は、別のマシンでテストをセットアップして実行してみてください。
  • 簡単なクエリを実行し、ステータス変数Qcache_hitsCom_selectステータス変数を調べて、クエリ キャッシュがヒットしているかどうかを判断します。
  • 複雑なクエリを試して、同じ値を監視してください。クエリがキャッシュにヒットしない場合は、クエリがキャッシュされない原因がわかるまで、クエリの小さな部分を試してみてください。キャッシュされている場合、クエリ内のテーブルのいずれかがクエリ間で更新され、キャッシュされたコピーが無効になることが問題の原因である可能性があります。
于 2010-12-09T17:14:05.007 に答える