2つのテーブルを含む左結合を最適化しようとしていますが、スピードアップのためにインデックスを丸めることができません。MySQLはインデックスとグループの最適化で結合しました
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;
これは現在、より多くを取る:私は次のタイプのクエリを実行する必要が
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 |
:
は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行が含まれています 表1は、2171289行が含まれています処理するのに5秒以上かかる。それはWebページ上に出力を表示する前に実行する必要がある非常に少数のクエリの1つなので、できる限り速くしたいと思います。 「説明」の出力は次のとおりです。
+----+-------------+-------+-------+---------------+---------+---------+----------------------+---------+--------------------------+
| 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を主キーにすることはできません。あなたが提案した他のものを試してみましょう。 –
これはキャッシュされており、別のユーザーが同じクエリを実行した場合に再利用できるため、これらのデータベースの作成にかなりの時間を節約できます。特定のDBがどれくらいの頻度でどのくらいの期間、どのくらいのユーザーが使用されているかを事前に調べる方法はありません。時には30人が同じことをすることがあります(これがキャッシュが理にかなっています)。時には、巨大なテーブルをコンパイルすると出力を一度しか見ることができない場合があります。全体的に、これは最良の妥協策に見えました。 –
また、「日」はあなたがそう思っているとは思っていません... ;-)「日」は、テキスト集合内の任意のレベルの注釈を含むことができるハンドルです(この場合、実際には日ですすなわち、1から31までの数字)。これはすべて、電子テキストコーパス(http://cwb.sourceforge.net/cqpweb.php)へのインターフェースに関連しています。 –