2

最適化する必要がある、大容量の 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_domainsidgoogle_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 行以上を処理できるように、クエリをより効率的にするのを手伝ってくれる人はいますか? よろしくお願いします!

4

1 に答える 1