私は2つのテーブルを持っています
- 言語記事 | 列: id (INT) ,de (VARCHAR),en (VARCHAR),count_links(INT)
- ウィキリンク | 列: article_id,link_id,nr_in_article (すべて整数)
記事の名前は列 de (ドイツ語) と en (英語) にあります。LangArticles テーブルの ID は、ID の article_id および link_id と同じです。
別の記事にリンクしているすべての記事名を取得したいと考えています。したがって、「abc」にリンクするすべての記事が必要です。「abc」の ID = 「1」
したがって、私の通常のクエリ(オーダーバイなし)は次のようになります。
select distinct(LA.de),W.nr_in_article,LA.count_links from
LangArticles as LA inner join WikiLinks as W on W.article_id = LA.id
where W.link_id in ("1")
これにはおそらく0.001秒かかり、100000の結果が得られます。本当はベスト5ヒットが欲しい。この場合のベストとは、最も関連性の高いものを意味します。このように並べ替えたい: 記事の冒頭で「abc」にリンクしている記事 (nr_in_article) と、それ自体のリンク数が多い記事 (count_links) は、ランキングが高いはずです。
私は使用しています
order by (1-(W.nr_in_article/LA.count_links)) desc
このため。
問題は、この順序を最適化する方法がわからないことです。
mysql の説明では、一時ファイルとファイルソートを使用する必要があり、キーによる順序でインデックスを使用できないと書かれています。テストのために、W.nr_in_article による「簡単な」注文を試したので、1 つのキーで通常の注文を行いました。
参考までに、私のインデックスは次のとおりです。
LangArticles: id (プライマリ)、de (一意)、en (一意)、count_links(インデックス)
WikiLinks: article_id(index),link_id(index),nr_in_article(index)
しかし、この2つのマルチインデックスlink_id、nr_in_articleとarticle_id、nr_in_articleも試しました。
また、order by を使用したクエリには約 5.5 秒かかりました。:(
100,000 個のエントリすべてを 1 つのインデックス (link_id) で見つける必要があり、その後ソートする必要があり、一時ファイルではインデックスを使用できないため、ここで MySql が一時ファイルとファイルソートを使用する必要がある理由はわかっていると思います。
しかし、これをより速くする方法はありますか?実際には、ベスト 5 ヒットだけが必要なので、すべてを並べ替える必要はありません。sthかどうかはわかりません。悪いソート(バブルソート)のように、ホールの一時テーブルをソートするクイックソートよりも高速です。