Sziasztok!
Egy iwiw eseményekhez hasonló dolgot szeretnék irni egy Rails alkalmazáshoz. Hogyan lenne ez nagyon gyors? Az ötleteim:
* events táblába user_id, ami szintén egy index, egy felhasználónak egy eseménye csak egyszer tárolódna, itt viszont a lekérdezés lenne lassabb (az összes ismerősön végig kellene menni).
* egy esemény, egy user és egy events_users tábla, itt szerintem a lekérdezés gyorsabb lenne, de a fórumnyitás lassú, mivel az összes ismerőst hozzá kell kapcsolni az event-hez.
* Az iwiw, facebook ezt vajon hogyan oldja meg?
- 1026 megtekintés
Hozzászólások
táblaösszekapcsolásról ugye már hallottál? :)
events tábla user_id alapján indexelve, ehhez hozzá tudod kapcsolni az ismerős táblát. Limitelj, és gyors lesz.
Amúgy hosszútávon meg jobban jársz, ha két events táblát csinálsz, az egyikben az aktuális infók vannak, a másikban a régiek. (a régi tábla tetszőlegesen nagyra megnőhet, és ezt már nem fogod az összes ismerőssel összekapcsolni, csak egy-egy userre szűrni)
- A hozzászóláshoz be kell jelentkezni
Igen, az egyik megoldásom is ez lett volna. A gond ezzel az, hogy ha egy usernek van mondjuk 100 ismerőse, akkor minden egyes ismerősön végig kell menni és lekérdezni, hogy az event táblában van-e új rekord hozzá kapcsolva. Régi tábla azért nem lesz, mert törölni fogom az 1 hétnél régebbi rekordokat.
Vagy valamit rosszul értelmezek?
- A hozzászóláshoz be kell jelentkezni
ooo, szerintem nem.
SELECT id, user_id, blabla FROM events WHERE user_id IN (1,5,6,7)
Vagy nem fogom a problemat?
- A hozzászóláshoz be kell jelentkezni
Hogy én mekkora hülye vagyok :)
- A hozzászóláshoz be kell jelentkezni
ez a megoldás nagyon lasssúúúú....
javaslom ismerkedj a right joinnal.
(a fenti megoldás a tábla minden során számol, nem fogja használni a user_id indexet.)
- A hozzászóláshoz be kell jelentkezni
Join is jo megoldas lehet, de ize.
mysql> explain select id, user_id from lofasz where user_id IN (1,3,5,32,342) \G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: lofasz
type: range
possible_keys: user_id
key: user_id
key_len: 4
ref: NULL
rows: 5
Extra: Using where
CREATE TABLE `lofasz` (
`id` int(10) NOT NULL auto_increment,
`user_id` int(10) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=500 DEFAULT CHARSET=utf8
Mondjuk ja, elismerem, hogy egy right join szebb :)
- A hozzászóláshoz be kell jelentkezni