SQLに問題があり、応答時間が遅いです。LIMITを使用して大規模なMySQLクエリを高速化する
私は索引が欠落しているためではありませんが、結果は巨大であるためです。これらを使用して、外部クライアントに配信されるAPIレスポンスをフィードします。応答を管理しやすくするために、私は改ページを使用しています。最終的に大きなページは最終的には完了するまでに800秒かかるところまでスローダウンします。これは、Webサービスが応答を提供するのを待っている間、ぶら下がっていることを意味します。
mysql> EXPLAIN SELECT * FROM externallinks_global LEFT JOIN externallinks_paywall ON externallinks_global.paywall_id=externallinks_paywall.paywall_id WHERE `has_archive` = 1 LIMIT 1385000,1001;
+------+-------------+-----------------------+--------+------------------------------------------------------------------+------------+---------+--------------------------------------------------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+-----------------------+--------+------------------------------------------------------------------+------------+---------+--------------------------------------------------+---------+-------+
| 1 | SIMPLE | externallinks_global | ref | HASARCHIVE,APIINDEX7,APIINDEX10,APIINDEX11,APIINDEX12,APIINDEX13 | APIINDEX13 | 1 | const | 4291236 | |
| 1 | SIMPLE | externallinks_paywall | eq_ref | PRIMARY | PRIMARY | 4 | s51059__cyberbot.externallinks_global.paywall_id | 1 | |
+------+-------------+-----------------------+--------+------------------------------------------------------------------+------------+---------+--------------------------------------------------+---------+-------+
2 rows in set (0.01 sec)
上記は問題のクエリです。これには800秒かかりました。それはかなりよく索引付けされています。私の質問は、大規模なセット内の深い結果のチャンクをフェッチすると、結果をすぐに得ることができます。これを行うにはいくつかの方法がありますか?
CREATE TABLE IF NOT EXISTS `externallinks_global` (
`url_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`paywall_id` INT UNSIGNED NOT NULL,
`url` VARCHAR(767) NOT NULL,
`archive_url` BLOB NULL,
`has_archive` TINYINT UNSIGNED NOT NULL DEFAULT '0',
`live_state` TINYINT UNSIGNED NOT NULL DEFAULT '4',
`last_deadCheck` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`archivable` TINYINT UNSIGNED NOT NULL DEFAULT '1',
`archived` TINYINT UNSIGNED NOT NULL DEFAULT '2',
`archive_failure` BLOB NULL DEFAULT NULL,
`access_time` TIMESTAMP NOT NULL,
`archive_time` TIMESTAMP NULL DEFAULT NULL,
`reviewed` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`url_id` ASC),
UNIQUE INDEX `url_UNIQUE` (`url` ASC),
INDEX `LIVE_STATE` (`live_state` ASC),
INDEX `LAST_DEADCHECK` (`last_deadCheck` ASC),
INDEX `PAYWALLID` (`paywall_id` ASC),
INDEX `REVIEWED` (`reviewed` ASC),
INDEX `HASARCHIVE` (`has_archive` ASC),
INDEX `ISARCHIVED` (`archived` ASC),
INDEX `APIINDEX1` (`live_state` ASC, `paywall_id` ASC),
INDEX `APIINDEX2` (`live_state` ASC, `paywall_id` ASC, `archived` ASC),
INDEX `APIINDEX3` (`live_state` ASC, `paywall_id` ASC, `reviewed` ASC),
INDEX `APIINDEX4` (`live_state` ASC, `archived` ASC),
INDEX `APIINDEX5` (`live_state` ASC, `reviewed` ASC),
INDEX `APIINDEX6` (`archived` ASC, `reviewed` ASC),
INDEX `APIINDEX7` (`has_archive` ASC, `paywall_id` ASC),
INDEX `APIINDEX8` (`paywall_id` ASC, `archived` ASC),
INDEX `APIINDEX9` (`paywall_id` ASC, `reviewed` ASC),
INDEX `APIINDEX10` (`has_archive` ASC, `live_state` ASC, `paywall_id` ASC, `archived` ASC, `reviewed` ASC),
INDEX `APIINDEX11` (`has_archive` ASC, `archived` ASC, `reviewed` ASC),
INDEX `APIINDEX12` (`has_archive` ASC, `live_state` ASC, `paywall_id` ASC),
INDEX `APIINDEX13` (`has_archive` ASC, `live_state` ASC),
INDEX `APIINDEX14` (`has_archive` ASC, `live_state` ASC, `paywall_id` ASC, `reviewed` ASC),
INDEX `APIINDEX15` (`has_archive` ASC, `live_state` ASC, `reviewed` ASC),
INDEX `APIINDEX16` (`has_archive` ASC, `paywall_id` ASC, `reviewed` ASC));
と
CREATE TABLE IF NOT EXISTS `externallinks_paywall` (
`paywall_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`domain` VARCHAR(255) NOT NULL,
`paywall_status` TINYINT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`paywall_id` ASC),
UNIQUE INDEX `domain_UNIQUE` (`domain` ASC),
INDEX `PAYWALLSTATUS` (`paywall_status` ASC));
グローバルテーブルは、およそ2700万行を持っており、ペイウォールテーブルを約があります。ここでは
は、クエリが上で実行されていると、テーブルがそれに参加した表であります1600万
クエリ、データ/データの作成、またはセットアップを改善する方法があるかもしれませんが、わかっているのはインデックスの名前だけです。それは「私は車を持っています。それは多くの部品から作られています。私はこれらの「api13」の1つに名前を付けました(実際には役に立つかどうかはわかりません)。車は騒音を発し、私は何をすべきか?"詳しくは、非常に一般的なヒントを提供するだけです。 [MySQLデータ - ページングを実装する最善の方法?](https://stackoverflow.com/questions/3799193/mysql-data-best-way-to-implement-paging)とそのすべてのリンク – Solarflare
ご意見ありがとうございます。どのような追加データを探していますか?テーブル自体?テーブルサイズ? – Cyberpower678
@Solarflare詳細を追加しました。詳細が必要な場合は、私にお知らせください。 – Cyberpower678