2012-04-10 2 views
2

アルファベットの各文字について2つの結果を持つインデックスページを作成したいと思います。データベース内の各文字の結果を表示するパフォーマンスが良い方法はありますか?

SELECT url_slug, name FROM artists WHERE name LIKE "A%" ORDER BY rand() LIMIT 10 
SELECT url_slug, name FROM artists WHERE name LIKE "B%" ORDER BY rand() LIMIT 10 
SELECT url_slug, name FROM artists WHERE name LIKE "C%" ORDER BY rand() LIMIT 10 
SELECT url_slug, name FROM artists WHERE name LIKE "D%" ORDER BY rand() LIMIT 10 
SELECT url_slug, name FROM artists WHERE name LIKE "E%" ORDER BY rand() LIMIT 10 
SELECT url_slug, name FROM artists WHERE name LIKE "F%" ORDER BY rand() LIMIT 10 

は、別のは、これを達成するために、よりパフォーマンスに優しい、方法があります:私はこれを持っている時点では

p.s.私は 'rand()'による注文はあまり良くないと知っています。しかし、これは開発中です。

+1

は、 'name'の列がインデックス化されていますか?そうでなければ、それは大きく助けなければならない。 –

+0

はいです。私は現時点でパフォーマンスの問題はありません..しかし、何かを26回選択することは「間違っている」と思われます。これは他の方法で行うことができますか? –

答えて

2

取得しようとしている目的のために、クエリはそのIMOより優れていません。しかし、テーブルが膨大な場合は、時折キャッシュテーブルに固定文字の値を別々に保持したいことがあります。

インデックスを作成し、フィールドごとにインデックスを作成します。

+0

おそらく毎日、いくつかのXMLファイルにキャッシュされるでしょう。これが唯一の方法であるかどうかはわかりませんでした。 –

1

はこの打撃を与える、それは私のテストデータに対して働い:

SELECT url_slug, name FROM artists WHERE name REGEXP '^[A-Z]'; 

- を更新 -

私はすべての名前を引っ張ってくるクエリ(制限なし)とグループを得ました彼らは手紙で、しかし制限なしで、価値がないかもしれない。

# Note, you do not need the WHERE clause if you want all letters 
# I left it in for dev testing 
select GROUP_CONCAT(CONCAT(url_slug, ':', name)) AS list, substr(name, 1, 1) as letter from artists where name REGEXP '^[A-B]' group by letter; 

は何あなたができることは、このように時間おきにクエリを発行し、文字で結果をキャッシュです。私はあなたに同意しますが、私は26回クエリするのではなく、一度クエリを実行する方が良いと思います。すべてのクエリに対して膨大な結果セットを取得していない限り、キャッシュを生成するのは大丈夫でしょう。

+0

ここで問題となるのは、グループ化されていないということです。 –

+0

ああ、私はあなたの質問を読み返した後、気づいた。私は答えを更新しました。それが私に知らせるのに役立たない場合、私は削除します。 –

0

私はあなたが各文字は、「結果のカップル」何を意味しているではないんだけど、それはあなたがこのような何かを行うことができ可能です:

各文字によってあなたのすべてのアーティストを取得します
select left(name, 1), url_slug, group_concat(name) 
from artists 
group by left(name, 1); 

+0

これは、特にGROUP_CONCAT関数でSEPERATORを使用したときに閉じられましたが、LIMITを遵守しません。現在のDBには問題ありません。しかし、もし私が名前のロードで終わると.. –

0

ない良いパフォーマーは(26Kレコードが私のネットブックに0.04sかかります)が、楽しさとあなたの26個のクエリよりも若干速い -

SELECT 
    url_slug, name, 
    IF(@prev <> LEFT(name, 1), @rownum := 1, @rownum := @rownum+1) AS rank, 
    @prev := LEFT(name, 1) 
FROM(
    SELECT * FROM artists ORDER BY LEFT(name, 1), RAND() 
) tmp, (SELECT @rownum := NULL, @prev := '') init 
HAVING rank <= 2 
関連する問題