1

約400万行以上のMySQLテーブルがあります。表は次のとおりです。

表の列Person

  • Id
  • Name
  • Age
  • Marital Status
  • Education Level
  • 「場所の国」
  • '説明'

に基づいてクエリを実行するときはAge、同じ年齢で、結婚歴が異なり、「教育レベル」と「場所の国」も異なる人々の要約数も取得したいと思います。

年齢と教育レベルに基づいてクエリを実行するときは、同じ年齢と教育レベルで、結婚歴が異なり、「場所の国」も異なる人々の要約数も取得したいと思います。

たとえば、発行されるクエリはSELECT * FROM Person WHERE Age = 27;SELECT Education Level, COUNT(*) FROM Person WHERE Age = 27 GROUP BY Education Level;また、とによって生成される結果が欲しいSELECT Location Country, COUNT(*) FROM Person WHERE Age = 27 GROUP BY Location Country;

また、説明のキーワードに基づいて検索を行う必要があり、他の各列の要約カウントが必要な場合、これは私にとってより困難になります。私が開発しているアプリケーションは一種の検索エンジンです。これはEbayのようなサイトで見ることができます、

これらのクエリを個別に実行できる可能性があります。ただし、400万行の場合、GROUPBYクエリにはかなりの時間がかかります。これはインターネットアプリケーションであり、クエリは数秒以内に完了するはずです。

どんな助けでも大歓迎です。

4

2 に答える 2

0

1つのクエリで両方を実行できます

SELECT p.*, count(p2.id)  
FROM Person p, Person p2 
WHERE p2.Age = p.age and p2.marital != p.marital and p1.education != p2.education 
GROUP BY p1.id

memcacheこのような状況では、データをキャッシュに保存することをお勧めします。新しいデータがテーブルに挿入された場合、または有効期限が切れた後にキャッシュを期限切れにして、クエリの実行時間が長くなるのを防ぐことができます。もう1つの改善点は、LIMITを使用して、次のようにDBから返される行の数を減らすことです。

SELECT p.*, count(p2.id)  
FROM Person p, Person p2 
WHERE p2.Age = p.age and p2.marital != p.marital and p1.education != p2.education 
GROUP BY p1.id
LIMIT 10
于 2012-11-17T03:38:43.593 に答える
0

あなたが説明していることから、必要な「ロールアップ」統計を含む別の集計テーブルを直接クエリする必要があります。「Person」テーブルが追加/変更される頻度。人の「年齢」のみを保存している場合、日付がない場合の年齢の根拠は何ですか。将来、その人を再度追加すると、複数のレコードが作成されます...そのように

X 歳のとき、非常に多くの人が結婚しており(または結婚していなくても)、このレベルの教育を受けていました。Y歳でこんなにたくさんの人が…など…

次のような要約テーブルを作成します

create table AgeStat ( 
   age int, 
   married int, 
   single int, 
   divorced int, 
   HighSchool int, 
   Associates int,
   Bachelors int,
   Masters int,
   Doctorate int )

次に、挿入中 (または必要に応じて更新/削除を含む) に、新しいレコードが適用可能なそれぞれのカウントに 1 を追加するように、person テーブルにトリガーを追加します。

次に、Web アプリの場合、年齢 = 27 で、すべての分類統計があるこの要約テーブルから 1 つのレコードを取得するのは瞬時です。

ただし、修士号を取得した既婚者の数を明確に知りたい場合は、マスターの人物リストにロールバックする必要があります。

または、同様の事前集計を行うことができますが、次のような粒度レベルを下げることができます

create table AgeStat ( 
   age int, 
   maritalstat int,    -- but I would actually use an enumerated value for marital status
   educationlevel int, -- and education level vs a hard description of each.
   peoplecount int )

同様に、年齢ごとに 2 つの組み合わせ要素に基づいてカウントを更新するトリガーがあります。次に、「既婚」の合計が必要な場合は、年齢 = 27 および maritalstat=(「既婚」値の列挙子) に対して sum(peoplecount) を実行できます。

頑張ってください。それがあなたの代替ソリューションに役立つことを願っています.

于 2012-11-17T08:52:50.137 に答える