2017-06-06 65 views
0

這裏是我的查詢:什麼是投票表的最佳索引?

SELECT qa.id, 
     qa.subject, 
     qa.category cat, 
     qa.keywords tags, 
     qa.body_html, 
     qa.amount, 
     qa.visibility, 
     qa.date_time, 
     COALESCE(u.reputation, 'N') reputation, 
     COALESCE(CONCAT(u.user_fname, ' ', u.user_lname), 'unknown') name, 
     COALESCE(u.avatar, 'anonymous.png') avatar, 

    (SELECT COALESCE(sum(vv.value),0) 
    FROM votes vv 
    WHERE qa.id = vv.post_id 
    AND 15 = vv.table_code) AS total_votes, 

    (SELECT COALESCE(sum(vt.total_viewed),0) 
    FROM viewed_total vt 
    WHERE qa.id = vt.post_id 
    AND 15 = vt.table_code 
    LIMIT 1) AS total_viewed 
FROM qanda qa 
LEFT JOIN users u ON qa.author_id = u.id 
AND qa.visibility = 1 
WHERE qa.type = 0 
ORDER BY qa.date_time DESC 
LIMIT 0, 
     11; 

這裏是EXPLAIN結果:

enter image description here

看到了嗎?最後一行(vv)不會使任何索引受益。而且,這裏是在votes表中的當前索引:

enter image description here

總之,什麼是你的建議嗎?我需要什麼指數才能使表現更好?

+0

表的表決是否包含大量的數據或大量的共貨幣?你爲什麼不在柱子post_id的VOTE上添加PK,那麼你在post_id上有唯一的數據和索引,你可以在post_id和table_code上添加索引,因爲你在where條件中選擇ti – Moudiz

+0

另外,LIMIT 1似乎是多餘 – Strawberry

回答

0

我認爲你需要將qa.visibility = 1LEFT JOIN..ON移動到WHERE。一旦你這樣做,有這些指標:

qanda: INDEX(visibility, type, date_time) -- date_time must be last 

這將徹底處理WHEREORDER BYLIMIT - 這可能是在性能上的最大提升。

vv and vt: INDEX(post_id, table_code) -- in either order 

您好像有(post_id, table_code, user_id)。如果這是唯一的,那麼將其推廣爲PRIMARY KEY並擺脫id;這將會帶來額外的提升。我們假設usersPRIMARY KEY(id)

vt子查詢不需要LIMIT 1

如果您需要進一步討論,請爲每個表提供SHOW CREATE TABLE

+0

請看看你的段落:*「你好像有..」* ..!是的,所以你的意思是我可以刪除'ID'列?老實說,沒有'id'列的表是很奇怪的':-)',不是嗎? – stack

+0

沒有_primary key_的表很奇怪。通常,「自然PK」在各種方面比人工「ID」更好。 InnoDB在通過二級索引查找時,獲取PK('id',在次級BTree的葉節點處),然後通過PK進行第二次查找。通過將索引移動到PK中(如果它是唯一的),讓查找只需一步,而不是兩步。 –

相關問題