[英]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_id
和Article_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
都有Release
和Article_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秒非常慢。
count()
結果)存儲在單獨的表中並正確更新它們。 然后,您可以在查詢中僅使用計數器值,而無需每次都執行大量數據庫請求。 type
字段創建索引。 EXPLAIN
進行進一步優化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.