2010-11-30 6 views
1

親愛なるphpとmysqlの熟練者 私は、ポストのartices 200,000records(index colume:sid)の2つのテーブルと、トピックのための小さなテーブル(index colume topicid)を持っています。 20のレコードを持っている.. 同じ小さなテーブルを持つ大きなテーブルを内部に結びつける方法

海流イム使用してをTOPICIDあります(それは丸い0.4秒かかった)

+テーブルから最後の50レコードを取得行います

SELECT SID、援助、タイトル、時間、トピック、情報提供者、ihome、alangua

しばらく(:各ポストで話題の加工への名前を見つけるために、各レコード内のループをしながら、GE、SIDのDESCのLIMITその後、0,50

+ BYカウンター、種類、画像、ORDER veryzoo_stories FROM chainidを行います...){TOPICID = '$トピック'」 veryzoo_topics FROM SELECTます。topicName .... }

+今 私はインナーがスピードアッププロセスに参加使用する予定が、私のテストとして、それは多くを取りました1.5秒から3.5秒まで長くなります

SELECT a.sid、a.aid、a.title、a.time、a.topic、a.informant、a.ihome、a.alanguage、a.counter、a.type、a.imagesインナーは全て2台から20万件のレコードを参加ください参加するように、a.chainid、t.topicname INNER JOINをveryzoo_stories FROM veryzoo_topicsトンON a.topic = t.topicidのSID DESCをLIMIT 0,50

BY ORDERは、それは見て長い時間がかかった拳、その後50で結果を制限..

正しい方法これを行うに私を指すように助けてください.. 例えば、表1から最後の50件のレコードを取る...その後、表2に参加さ...電気ショック療法

答えて

0

二つのテーブルは同じ主キーを共有しない限り、内部結合ない使用していますか、重複する値(そしてもちろん遅くクエリ)を取得します。

+0

NOP 2つの表は、同じPキーを持っていけない...大田部のp個のキーがあります。sidと小さなテーブルは、私はしばらく使用したpキー –

+0

としてTOPICIDました。結合は、特定の条件が満たされない限り、クエリを高速化する方法にはなりません。 – ascanio

+0

私は同意しません。 50個のクエリを作成すると、多くのオーバーヘッドが発生します。結合(またはWHEREとの野蛮な結合)では、クエリは1つだけになります。 JOInのステートメントはリレーションシップで動作するように作られています。データベースがうまく設計されていて(インデックスとリレーションシップで)、リレーションをサポートする最新のエンジンを使用すると、パフォーマンスが向上するはずです。 –

0

私はちょうどネストされたクエリ+内部結合にテストを与えて、パフォーマンスが大幅に向上することを驚かせました。今はわずか0.22秒しかかかりませんでした。ここに私のクエリは次のとおりです。

SELECT a.*, t.topicname 
FROM (SELECT sid, aid, title, TIME, topic, informant, ihome, alanguage, counter, TYPE, images, chainid 
    FROM veryzoo_stories 
    ORDER BY sid DESC 
    LIMIT 0, 50) a 
    INNER JOIN veryzoo_topics t ON a.topic = t.topicid 

これ以上の解決策を考え出すていない場合、私はこの1つを使用することができる。..誰もがこの投稿を

+0

申し訳ありませんが私は答えを見ませんでした。これはまさに私がやったことです。私はそれが正しい道だと思う。 –

+0

veryzoo_stories.sid、veryzoo_stories.topic、およびveryzoo_topics.topicidのインデックスはありますか?これにより、パフォーマンスも向上します。 –

0

を見てくれてありがとうこれを試してください:

SELECT * 
FROM (
SELECT a.sid, a.aid, a.title, a.time, a.topic, a.informant, a.ihome, a.alanguage, a.counter, a.type, a.images, a.chainid 
FROM veryzoo_stories a 
ORDER BY sid DESC 
LIMIT 0 , 50 
)b 
INNER JOIN veryzoo_topics t ON b.topic = t.topicid 

私が作りました小さなテストとそれは速いようです。サブクエリ(ネストされたクエリ)を使用して最初に50個のレコードを選択し、次に結合します。

また、veryzoo_stories.sid、veryzoo_stories.topic、およびveryzoo_topics.topicidがインデックスであること(また、InnoDBを使用している場合は関係が存在すること)も確認してください。パフォーマンスが向上するはずです。

これで、ORDER BY LIMITの問題が残りました。選ぶ前に200,000レコードを注文するので重いです。私はそれが必要だと思う。ORDER BYを使用する場合、索引は非常に重要です。ここで

は、問題の記事です:ORDER BY … LIMIT Performance Optimization

+0

確認していただきありがとうございます。あなたのソリューションと同じように見えます。私はこのことにこだわります。ありがとうございます。 –

+0

OK。興味がある場合は、ORDER BY LIMITのパフォーマンスに関する興味深い記事へのリンクを追加しました。私が言及した列の索引はありますか?どのバックエンドを使用していますか(InnoDB、MyISAM)?とにかく質問に答えると思われる場合は、受け入れるように1つの回答(あなたまたは私)を選択してください。 –

関連する問題