だから私はプロジェクトのために次のことをしたいです。
私は3つのテーブルを持っています。最初の 2 つは現在私たちに関係しています (3 番目は理解を深めるためのものです)。
author {id, name}
authorship {id, id1, id2}
paper {id, title}
authorship は著者と論文を結びつけ、authorship.id1 は author.id を参照し、authorship.id2 は paper.id を参照します。
私がやりたいことは、各著者のノードと、2 人の著者間の共通論文の量によって決定されるエッジを持つグラフを作成することです。
w=1 - union_of_common_papers/intersection_of_common_papers
それで、私が(stackoverflowの助けを借りて)作成したものは、すべての共著者のカップルに加えて、一般的な論文の結合と交差の量を返すSQLスクリプトです。その後、Javaでデータを使用します。それは次のとおりです。
SELECT DISTINCT a1.name, a2.name, (
SELECT concat(count(a.id2), ',', count(DISTINCT a.id2))
FROM authorship a
WHERE a.id1=a1.id or a.id1=a2.id) as weight
FROM authorship au1
INNER JOIN authorship au2 ON au1.id2 = au2.id2 AND au1.id1 <> au2.id1
INNER JOIN author a1 ON au1.id1 = a1.id
INNER JOIN author a2 ON au2.id1 = a2.id;
これは私の仕事であり、次のようなリストを返します。
+-----------------+---------------------+---------+
| name | name | weight |
+-----------------+---------------------+---------+
| Kurt | Michael | 161,157 |
| Kurt | Miron | 138,134 |
| Kurt | Manish | 19,18 |
| Roy | Gregory | 21,20 |
| Roy | Richard | 74,71 |
....
重さでは、2 つの数字 a,b を見ることができます。ここで、b は交点で、ba は一般的な紙の和です。
しかし、これには多くの時間がかかります。そして、すべてのオーバーヘッドは、この余分な副選択によるものです
(SELECT concat(count(a.id2), ',', count(DISTINCT a.id2))
FROM authorship a
WHERE a.id1=a1.id or a.id1=a2.id) as weight
この行がないと、すべてのレコード (1M+) が 2 分未満で返されます。この行では、50 レコードが 1.5 分以上必要です
コマンドラインからLinuxでmysqlを使用しています
最適化する方法はありますか?
- 著者は約130,000件のレコードを持っています
- 著者数 ~1,300,000 レコード
- クエリは ~1,200,000 レコードを返す必要があります
これは、このクエリに対して Explain が返すものです。使い方がわからない。
+----+--------------------+-------+--------+---------------------+-----------+---------+--------------+---------+-----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------+--------+---------------------+-----------+---------+--------------+---------+-----------------+
| 1 | PRIMARY | a1 | ALL | PRIMARY | NULL | NULL | NULL | 124768 | Using temporary |
| 1 | PRIMARY | au1 | ref | NewIndex1,NewIndex2 | NewIndex1 | 5 | dblp.a1.ID | 4 | Using where |
| 1 | PRIMARY | au2 | ref | NewIndex1,NewIndex2 | NewIndex2 | 5 | dblp.au1.id2 | 1 | Using where |
| 1 | PRIMARY | a2 | eq_ref | PRIMARY | PRIMARY | 4 | dblp.au2.id1 | 1 | |
| 2 | DEPENDENT SUBQUERY | a | ALL | NewIndex1 | NULL | NULL | NULL | 1268557 | Using where |
+----+--------------------+-------+--------+---------------------+-----------+---------+--------------+---------+-----------------+