簡體   English   中英

需要幫助的mysql連接

[英]need help with mysql joins

Users table
 user_id
 pic_url
 name

friends table
 auto_id
 userid
 friendid
 status

actions table
 auto_id
 userid
 type
 subject
 body
 datetime

我想讓更新的朋友流顯示更新,可以是博客文章,狀態更改等,但只能顯示來自已登錄用戶的朋友的更新

這是我想出的,但是我的用戶群很大,因此性能是必須的,是否有更好的方法呢? 請給我看

SELECT u.user_id, u.pic_url, u.name, a.auto_id, a.userid, a.type, a.subject, a.body, a.datetime
FROM actions AS a
LEFT JOIN users AS u ON u.auto_id=a.userid
LEFT JOIN friends AS f ON f.userid=a.userid
WHERE f.friendid=1 //1 would be my user ID 
AND f.status=active

請幫助我,我認為這是不正確的。

可以說有50,000個用戶,我的用戶ID是#1,我是20,000個用戶的朋友,它應該返回由我作為朋友的用戶發布的動作表中的所有條目,還需要修改以包含我自己的動作

我聽說有人談論使用某種哈希表進行更快的查找,這里可能會發生這種情況嗎?

謝謝你的幫助

我聽說有人談論使用某種哈希表進行更快的查找,這里可能會發生這種情況嗎?

這稱為索引 ,您應該使用JOIN(或與顯式約束(例如>, >=, =, <=, <或僅匹配IN ()IN ()子句匹配IN ()在要計划的每一列上添加一個索引說明清單中的項目)。 這樣,數據庫服務器可以直接跳到索引中的正確條目,而不必在所有表行中進行蠻力搜索。 就像書中的索引一樣。 如果要查找名稱為“ Knuth”的書中的頁面,則有兩種選擇。 如果這本書有索引,您可以在索引中查找並希望其中有名稱。 如果這本書沒有索引,那么您只需要自己閱讀整個內容,這將花費更長的時間。

如果您關心排序/排序(或進行任何形式的相對數字/字符串比較),則它應該是排序索引。 否則,它可以是哈希表索引,這對於具有很多行的表來說更快,但是沒有排序信息。 這些類型的詳細信息可能使用不同的語法/選項,具體取決於所使用的數據庫服務器軟件的類型。**(請參閱下面的注釋)

請注意,主鍵已經具有自動生成的索引,因此您不必自己添加一個。 還請注意,如果您有一個多列主鍵,例如(州,城市,郵政編碼),則主鍵的最左側子集將有效地存在索引,例如,您獲得了State的索引,而(State,City) ,和(State,City,Zipcode)是免費的,但是如果您想在Zipcode或City或(City,Zipcode)上加入JOIN,則除了主鍵提供的索引之外,還需要創建自己的索引。

在您的情況下,您似乎應該在這些列上有索引(我*-我假定的列已經是主鍵)。 除非您對用戶ID的數字順序有任何意義,否則這些將是哈希表索引的良好候選者。

Users.user_id*
Friends.user_id
Friends.friend_id
Friends.active
Actions.user_id

**對於MySQL,您在CREATE INDEX語句中添加了一個子句,該子句表示將USING HASH用於哈希表索引,或將USING BTREE(用於排序索引)...忽略RTREE,因為它們是空間數據。 還要注意,MySQL不允許在通用存儲引擎InnoDB和MyISAM上使用HASH索引。 真正需要高性能的大型數據集可能需要將數據鏡像到帶有HASH索引的內存表中。 擁有50,​​000行,您可能不必擔心它。 BTREE的搜索時間為O(log n),而HASH的搜索時間為O(1),並且差別可能不大。 BTREE非常寬,並且設計得不深; 要在搜索步驟中進行一次單獨的比較,您可能需要將行數增加10或100。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM