我正在製作一個抓取項目,以抓取物品,並通過不同的時間表查看它們的計數。計劃是用戶定義的時間段(日期),當腳本打算運行時。如何使用子查詢,WHERE IN和varchar比較字段來優化查詢?
表結構如下:
CREATE TABLE IF NOT EXISTS `stats` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`schedule_id` smallint(11) NOT NULL,
`type` smallint(11) NOT NULL,
`name` varchar(250) COLLATE utf8_unicode_ci NOT NULL,
`views` int(11) NOT NULL,
`updated_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
所有數據被存儲在表中的統計信息,並在以後將進行分析,以看在視圖的類型明智增長。
的數據會是這樣:
樣本集
刮擦是在週期完成,每個日程,預計有大約20K entries.The時間表可能是以每日或每週爲單位制作,因此在5-6個月內數據將增長到2-3百萬。
在這些數據上,我需要執行查詢來彙總出現在選定時間表範圍內的相同名稱。
例如:
我需要骨料相同的項目(名稱),它遇到多個計劃。如果選擇時間表1和2,則僅選擇兩個時間表下的項目。因此,這裏將是項目A和項目B。
這裏應該計算視圖的類型總和。
因此,對於時間表1:(修訂版)
SELECT COUNT(t.`type`) AS count, SUM(t.views) AS view_count
FROM `stats` t
INNER JOIN
(
SELECT name,COUNT(name) as c FROM `stats` WHERE `schedule_id` IN (1,2) GROUP BY name HAVING c=2
) t2 ON t2.`name` = t.`name`
WHERE `schedule_id`=2 GROUP BY type
這是我的預期的結果。
但我已閱讀使用子查詢,WHERE IN,varchar比較字段將無助於具有優化的查詢。如何可以優化此更好的性能。
爲同類型聚集的規則將如下所示:
1.Under時間表ID,有可能是與schedule_id,名稱和類型不同類型value.Combination相同的名字將不會被複制。
2.類型明智的聚合器 - 將每個類型下的值相加。
我正在做項目在Python -MySQL的刮目的和PHP的上市results.I想知道如何正確組織這個表以及查詢更好的性能。 請諮詢。
對於初學者,我會製作一個字典表,其中包含id和相應的名稱,如'itemA',並且只存儲主表中的id。這肯定會加快查詢速度,並且如果您想要檢索名稱,您可以隨時通過ID加入字典表。 – 2014-11-05 08:44:41
@ConsiderMe像ItemA這樣的名字只是一個虛擬值。在實際情況下,它不會將這個名稱帶入字典表中。如果varchar創建問題,是否可以將varchar名稱字符串轉換爲整數。 – Surabhil 2014-11-05 08:59:46
與性能無關,但您的子查詢正在嘗試查找schedule_id爲1和2的記錄。但是,它也會匹配schedule_id 1兩次的任何記錄。如果這在邏輯上不可能發生,那麼你可以輕鬆地重寫它而不用子查詢。 – Kickstart 2014-11-05 10:21:46