我試圖優化一個涉及兩個表的左連接,但是我無法讓我的頭繞着可能的索引加速事情。 表1包含2171289行:MySQL左加入分組 - 索引優化
text_metadata_for_nzcorpus | CREATE TABLE `text_metadata_for_nzcorpus` (
`text_id` varchar(255) NOT NULL,
`newspaper` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`year` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`month` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`day` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`section` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`subsection` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`topics` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
`words` int(11) NOT NULL DEFAULT '0',
`cqp_begin` bigint(20) unsigned NOT NULL DEFAULT '0',
`cqp_end` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`text_id`),
KEY `newspaper` (`newspaper`),
KEY `year` (`year`),
KEY `month` (`month`),
KEY `day` (`day`),
KEY `section` (`section`),
KEY `subsection` (`subsection`),
KEY `topics` (`topics`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
第二個表只包含8584行:
db_dist_fb8ddyk760 | CREATE TABLE `db_dist_fb8ddyk760` (
`text_id` varchar(255) COLLATE utf8_bin DEFAULT NULL,
`beginPosition` int(11) DEFAULT NULL,
`endPosition` int(11) DEFAULT NULL,
`refnumber` mediumint(9) NOT NULL AUTO_INCREMENT,
KEY `refnumber` (`refnumber`),
KEY `text_id` (`text_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16384 DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
我需要運行以下類型的查詢:
SELECT md.day as handle, count(db.text_id) as hits,
count(distinct db.text_id) as files FROM text_metadata_for_nzcorpus as md
LEFT JOIN db_dist_fb8ddyk760 as db on md.text_id = db.text_id
GROUP BY md.day;
目前這需要更多處理時間超過5秒。由於這是我在網頁上顯示輸出之前需要運行的很多查詢中的一種,如果可能的話,我希望加快速度。這裏是「解釋」的輸出:
+----+-------------+-------+-------+---------------+---------+---------+----------------------+---------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+---------+---------+----------------------+---------+--------------------------+
| 1 | SIMPLE | md | index | day | day | 768 | NULL | 2452080 | Using index |
| 1 | SIMPLE | db | ref | text_id | text_id | 768 | cqpweb_db.md.text_id | 1 | Using where; Using index |
+----+-------------+-------+-------+---------------+---------+---------+----------------------+---------+--------------------------+
任何有幫助的建議,將不勝感激。 (我不是系統的開發人員,我不負責代碼本身 - 但如果事情可以改進,我想爲程序員提供輸入...)
非常感謝! Sebastian
感謝您的支持。不幸的是,text_id不能成爲主鍵。將嘗試你建議的其他事情。 –
因爲它被緩存,並且可以在其他用戶執行相同的查詢時再次使用 - 這爲創建這些數據庫節省了相當多的時間。沒有辦法事先了解多久使用一次特定數據庫的用戶數量。有時30個人可能會做同樣的事情(這就是爲什麼緩存有意義),有時用戶可能會導致編譯一個巨大的表僅僅看一次輸出......我們已經選擇了持久數據庫選項,因爲在整體來看,這似乎是最好的折衷方案。 –
另外,「日」不是我認爲你認爲它是... ;-)「日」只是一個句柄,可以包含文本集合中的任何級別的註釋(在這種情況下,它確實是一天的月份,即1到31之間的數字)。所有這些涉及到電子文本語料庫的接口 - http://cwb.sourceforge.net/cqpweb.php - 如果您有興趣的話。 –