簡體   English   中英

第一次查詢需要5秒以上

[英]First query take more then 5 seconds

所以我有這個問題

SELECT a.`title`,a.`id`,a.`numvol`,a.`numepi`,a.`release_date`,
     (SELECT COUNT(id) FROM `Release` r WHERE r.`article_id`=a.`id`) AS `num_rows`,
     (SELECT COUNT(id) FROM `Article_views` av WHERE av.`article_id`=a.`id`) AS `num_rows2`
 FROM `Article` a  WHERE a.`type` = 'ani' ORDER BY a.`title` ASC

第一次加載需要5秒鍾,如果我刷新它需要大約0.001秒,有沒有辦法統一加載時間?

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra
1   PRIMARY             a   ALL     NULL            NULL    NULL        NULL    567     Using where; Using filesort
3   DEPENDENT SUBQUERY  av  ALL     NULL            NULL    NULL        NULL    5301    Using where
2   DEPENDENT SUBQUERY  r   ALL     NULL            NULL    NULL        NULL    11717   Using where

我嘗試用連接做但它根本沒用,所以我放棄了這種方式......

使用barmar查詢。 方式更好:)(和索引 - , - ')

id  select_type     table          type     possible_keys   key         key_len     ref     rows    Extra
1   PRIMARY         <derived2>     ALL      NULL            NULL        NULL        NULL    536     Using temporary; Using filesort
1   PRIMARY         a              eq_ref   PRIMARY         PRIMARY     4           r.art.. 1       Using where  
1   PRIMARY         <derived3>     ALL      NULL            NULL        NULL        NULL    574     Using where; Using join buffer
3   DERIVED         Article_views  index    NULL            article_id  4           NULL    5301    Using index
2   DERIVED         Release        index    NULL            article_id  4           NULL    11717   Using index

謝謝你們的時間和解決方案:)我想我需要重做這個舊項目的一個很好的部分ahah :)

請嘗試此查詢:

SELECT a.`title`,a.`id`,a.`numvol`,a.`numepi`,a.`release_date`, `num_rows`, `num_rows2`
FROM `Article` a
JOIN (SELECT article_id, COUNT(*) AS num_rows
      FROM Release
      GROUP BY article_id) r
ON r.article_id = a.id
JOIN (SELECT article_id, COUNT(*) AS num_rows2
      FROM Article_views
      GROUP BY article_id) av
ON av.article_id = a.id
WHERE a.`type` = 'ani'
ORDER BY a.`title` ASC

以我的經驗,JOIN比關聯子查詢更快。

為了提高性能,請確保在Release.article_idArticle_views.article_id上具有索引。

我想,第二次嘗試是受益於SQL QUERY CACHE 我想知道是否添加SQL_NO_CACHE ,每次嘗試都花了5秒鍾?

SELECT SQL_NO_CACHE a.`title`,a.`id`,a.`numvol`,a.`numepi`,a.`release_date`,
....

指標

哎呀。 你沒有相關的INDEX。 你能添加以下索引嗎?

ALTER TABLE Article ADD INDEX(type);
ALTER TABLE Release ADD INDEX(article_id);
ALTER TABLE Article_views ADD INDEX(article_id);

更高效的查詢

然后您的查詢轉換為JOIN 我想這比你的快得多。 假設每篇Article都有ReleaseArticle_views

SELECT a.`title`,a.`id`,a.`numvol`,a.`numepi`,a.`release_date`,
     COUNT(r.id) AS `num_rows`,
     COUNT(av.id) AS `num_rows2`
FROM `Article` a JOIN Release r ON r.`article_id`=a.`id`
  JOIN Article_views av ON av.`article_id`=a.`id`
WHERE a.`type` = 'ani'
GROUP BY a.title, a.id, a.numvol, a.numepi, a.release_date
ORDER BY a.`title` ASC;

查詢延遲的顯着改善歸因於內部MySQL緩存功能。

在第一次執行查詢之后,結果集被緩存在RAM中,因此結果第二個查詢與之前的匹配,立即從RAM中獲取而沒有HDD訪問。

關於MySQL內部緩存有不同的觀點,專家經常建議使用memecached,Redis或其他一些緩存層在高負載生產環境中禁用它。

但絕對應該嘗試通過關閉緩存來優化查詢的性能 - 5秒非常慢。

  1. 盡量不要使用子查詢,因為MySQL優化器不具備它們的性能。
  2. 將計數器的值( count()結果)存儲在單獨的表中並正確更新它們。 然后,您可以在查詢中僅使用計數器值,而無需每次都執行大量數據庫請求。
  3. 創建索引,例如,為type字段創建索引。
  4. 使用EXPLAIN進行進一步優化

暫無
暫無

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

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