最適化する必要がある、大容量の MySQL クエリと言えるものがあります。クエリが行うことは、バックリンクの処理に関連するデータを選択することです。
バックリンク処理とは、約 100,000 のリンクがデータベースに追加されることを意味します。リンクが選択され、私の Web サイトへのバックリンクを探してバッチでカールされます。
このクエリで選択している情報は次のとおりです。
complete
- 処理が完了しました (bool 1 または 0)current_step
- 3 つのうち、どのステップにいるのか (1、2、または 3)percent
- 現在のステップの達成率 (0.0-100.0)total_rows
- そのテーブル キー ID (整数) を持つデータベース内のすべての行の完全なカウントlive_rows
- 私のページへのライブバックリンクで見つかったリンクの数 (整数)dead_rows
- バックリンクのないリンクの数 (整数)
注: 現在のステップは、列の MAX() 値を参照して計算されchecked
ます。リンクが見つからない場合は、リンクを 2 回チェックします。したがって、ツールが最初に実行を開始したとき、すべてのchecked
値がゼロに設定されているため (処理がまだ開始されていないため)、現在のステップをステップ 1 にする必要があります。次に、すべての行を処理し、すべてのchecked
値を 1 に設定し、ステップ 1 でパーセントが 100.00 として返されると、プログラムは、最初にデッドであることが判明したリンクのダブル チェックを開始します。2 番目のチェックが行われると、一部の行が 2 に設定されるため、MAX(checked) はステップ 2 で 2 を返します。ステップ 2 が完了すると、プログラムはprocessing_complete
列を 1 に変更し、完了の現在のステップとして 3 を返します。UI が完了ステータスに変わるため、3 を返します。
2 つのテーブルがあります。一般的な構造は次のとおりです。は、 の列に戻るためのtablekey_id
外部キーであることに注意してください。google_sort_backlink_domains
id
google_sort_tablekey
google_sort_tablekey:
id
- 主キー、インデックス列unique_id
- このツール実行の一意の識別子として使用される一意のハッシュprocessing_completed
- 処理が完了すると bool フラグが 1 に設定されます
google_sort_backlink_domains:
id
- 主キー、インデックス列tablekey_id
- google_sort_tablekey への外部キーchecked
- リンクがカールしたときに bool フラグが 1 に設定され、その後link_found
- 1 回目または 2 回目のチェックで被リンクが見つかった場合、bool フラグが 1 に設定されますlink_href
- 文字列、ページへのリンク
これは、そのデータがどのように見えるかの非常に小さな例です
google_sort_tablekey:
id unique_id processing_completed
23 35799756448 1
24 78698778978 0
google_sort_backlink_domains:
id tablekey_id checked link_found link_href
11 23 1 0 http://www.website.com/1...
12 24 0 0 http://www.website.com/2...
13 23 1 1 http://www.website.com/3...
14 24 1 1 http://www.website.com/4...
15 24 1 1 http://www.website.com/5...
16 24 0 0 http://www.website.com/6...
これは機能するクエリですが、100,000行のデータセットを処理すると、時間がかかります。読みやすくするためにスペースを追加しました。また、ID を 24 にハードコーディングしました。これは、本番環境では変数で設定されます。
SELECT `processing_completed` AS complete,
ROUND((SELECT((SUM(IF((`link_found` = 1 OR `checked` >= (SELECT MAX(`checked`)
FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24)), 1, 0)) / SUM(1))*100) AS percent
FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24), 1) AS percent,
CASE WHEN `processing_completed` = 1 THEN 3 WHEN MAX(`checked`) = 0 THEN 1 ELSE MAX(`checked`) END AS current_step,
(SELECT COUNT(1) FROM `google_sort_backlinks` WHERE `tablekey_id` = 24) AS total_rows,
(SELECT COUNT(1) FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24) AS unique_domains,
(SELECT COUNT(1) FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24 AND `link_found` = 1) AS live_rows,
(SELECT COUNT(1) FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24
AND `checked` >= (
SELECT CASE WHEN `processing_completed` = 1 THEN 3 WHEN MAX(`checked`) = 0 THEN 1 ELSE MAX(`checked`) END FROM `google_sort_backlink_domains` WHERE `tablekey_id` = 24
)) AS dead_rows
FROM `google_sort_tablekey` AS tablekey
JOIN `google_sort_backlink_domains` AS domain ON domain.tablekey_id = tablekey.id
WHERE domain.tablekey_id = 24
google_sort_backlink_domains テーブルで 100,000 行以上を処理できるように、クエリをより効率的にするのを手伝ってくれる人はいますか? よろしくお願いします!