2012-04-10 38 views
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'列索引?如果不是這應該有很大幫助。 – 2012-04-10 23:34:27

+0

是的。我目前沒有任何性能問題..但選擇26次似乎是錯誤的,因此我的問題;這可以通過其他方式完成嗎? – 2012-04-10 23:36:33

回答

2

出於您試圖獲得的目的,查詢沒有比IMO更好。但是,如果表格很龐大,可能需要偶爾使緩存表單獨保存固定字母的值。

和索引,您記錄索引,按字段。

+0

他們可能每天都會緩存一些XML文件,是的。我不確定這是否是唯一的方法.. – 2012-04-11 00:01:02

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

這裏的問題是我沒有把它們重新分組。 – 2012-04-10 23:59:18

+0

啊,我注意到我重讀你的問題之後。我更新了答案,如果它無法讓我知道,我會刪除。 – 2012-04-11 00:28:49

0

我不是你的「情侶結果」每個字母的意思,但有可能,你可以做這樣的事情:

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

由每個字母讓你所有的藝術家。

+0

這一個被關閉了,特別是當我在GROUP_CONCAT函數中使用SEPERATOR時,但它不遵守LIMIT。對於目前的數據庫,這將是沒有問題的。但是,如果我結束了大量的名字.. – 2012-04-11 00:12:56

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 
相關問題