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 

これを達成するための別の、よりパフォーマンスに優しい方法はありますか?

私が知っているPS'rand()による順序'はあまり良くありません。しかし、これはまだ開発中です。

4

4 に答える 4

2

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

そして、索引付け、フィールドごとに記録する索引付け。

于 2012-04-10T23:54:43.697 に答える
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 回クエリを実行するよりも、1 回クエリを実行する方が良いと思います。クエリごとに膨大な結果セットを取得しない限り、キャッシュにデータを入力しても問題ないと思います。

于 2012-04-10T23:53:52.400 に答える
0

各文字の「いくつかの結果」という意味ではありませんが、次のようなことができるでしょうか。

select left(name, 1), url_slug, group_concat(name) 
from artists 
group by left(name, 1);

これにより、すべてのアーティストが文字ごとに表示されます。

于 2012-04-10T23:54:46.853 に答える
0

パフォーマンスは良くありませんが (私のネットブックでは 26K レコードに 0.04 秒かかります)、楽しく、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
于 2012-04-11T00:58:09.590 に答える