我有一個帶有「137678997」記錄且沒有唯一主鍵的表。這是我的表格描述。提高mysql雲查詢表的性能sql
+---------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+---------------+------+-----+---------+-------+
| domain | varchar(50) | YES | MUL | NULL | |
| guid | varchar(100) | YES | | NULL | |
| sid | varchar(100) | YES | MUL | NULL | |
| url | varchar(2500) | YES | | NULL | |
| ip | varchar(20) | YES | | NULL | |
| is_new | varchar(20) | YES | | NULL | |
| ref | varchar(50) | YES | | NULL | |
| user_agent | varchar(255) | YES | | NULL | |
| stats_time | datetime | YES | | NULL | |
| country | varchar(50) | YES | | NULL | |
| region | varchar(50) | YES | | NULL | |
| city | varchar(50) | YES | | NULL | |
| city_lat_long | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | | NULL | |
+---------------+---------------+------+-----+---------+-------+
域,郵件索引,STATS_TIME
我的SQL查詢
SELECT p1.guid, p1.email,MAX(mx_time) as latest_time,
p1.city_lat_long, p1.user_agent,
p1.city, p1.region, p1.country
FROM(
SELECT guid, email,
MAX(stats_time)as mx_time,
city_lat_long, user_agent,
city, region, country
FROM page_views
WHERE domain ='our'
AND DATE(CONVERT_TZ(stats_time,'+00:00','+05:30'))
BETWEEN DATE('2013-06-21 00:00:00')
AND DATE('2013-08-21 00:00:00')
GROUP BY guid) p1
WHERE p1.email !=""
GROUP BY email
UNION ALL
SELECT p2.guid, p2.email,
mx_time, p2.city_lat_long,
p2.user_agent, p2.city,
p2.region, p2.country
FROM(
SELECT guid, email,
MAX(stats_time) as mx_time,
city_lat_long, user_agent,
city, region, country
FROM page_views
WHERE domain ='our'
AND DATE(CONVERT_TZ(stats_time,'+00:00','+05:30'))
BETWEEN DATE('2013-06-21 00:00:00')
AND DATE('2013-08-21 00:00:00')
GROUP BY guid) p2
WHERE p2.email="";
對不起,這個大的查詢,其目的是獲得最新訪客(MAX(STATS_TIME))一個域名。在這裏我使用了UNION ALL,因爲我不得不通過電子郵件ID將所有匿名用戶分組。
我也做了一個簡單的選擇列沒有UNION ALL,這需要超過15分鐘的測試。我該如何提高我桌子上查詢的性能? 它實際上是一個帶有D2 Tier(1 GB RAM)的Google雲端SQL。真的很感謝你的建議,對於Mysql來說是非常新的。
編輯::
SELECT p2.guid, p2.email,mx_time, p2.city_lat_long, p2.user_agent, p2.city, p2.region, p2.country
FROM
(SELECT guid, email,MAX(stats_time)as mx_time, city_lat_long, user_agent, city, region, country FROM page_views WHERE domain ='our' AND DATE(CONVERT_TZ(stats_time,'+00:00','+05:30')) BETWEEN DATE('2013-06-21 00:00:00') AND DATE('2013-08-21 00:00:00') GROUP BY guid) p2 where p2.email=""
該查詢給了我與誰亙古不具有郵件遊客行。
而且
SELECT p1.guid, p1.email,MAX(mx_time) as latest_time, p1.city_lat_long, p1.user_agent, p1.city, p1.region, p1.country
FROM
(SELECT guid, email,MAX(stats_time)as mx_time, city_lat_long, user_agent, city, region, country FROM page_views WHERE domain ='our' AND DATE(CONVERT_TZ(stats_time,'+00:00','+05:30')) BETWEEN DATE('2013-06-21 00:00:00') AND DATE('2013-08-21 00:00:00') GROUP BY guid) p1 where p1.email !="" GROUP BY email
這一個給我這是不是空的,並通過電子郵件進行分組行。 而這兩者都是UNION ALL,因爲我需要在特定日期範圍內的所有匿名訪問者+已知訪問者(email!=「」)。
謝謝:)
你在_Where_子句中有很多函數,對你的查詢有什麼不好,實際上Union All,Group By,你最好添加表結構和你的期望結果,我們將嘗試改變這個查詢 –