sql >> Databáze >  >> RDS >> Mysql

Nejlepší způsob, jak ukládat značky pro rychlost v obrovské tabulce

FULLTEXTOVÉ indexy opravdu nejsou tak rychlé, jak si možná myslíte.

Pro uložení značek použijte samostatnou tabulku:

Table tags
----------
id integer PK
tag varchar(20)

Table tag_link
--------------
tag_id integer foreign key references tag(id)
content_id integer foreign key references content(id)
/* this table has a PK consisting of tag_id + content_id */

Table content
--------------
id integer PK
......

Veškerý obsah se značkou x VYBERETE pomocí:

SELECT c.* FROM tags t
INNER JOIN tag_link tl ON (t.id = tl.tag_id)
INNER JOIN content c ON (c.id = tl.content_id)
WHERE tag = 'test'
ORDER BY tl.content_id DESC /*latest content first*/
LIMIT 10;

Kvůli cizímu klíči jsou všechna pole v tag_links jednotlivě indexována.
„WHERE tags ='test' vybere 1 (!) záznam.
Equi to spojí s 10 000 taglinks.
A Equi spojuje to každý s 1 záznamem obsahu (každý tag_link vždy ukazuje pouze na 1 obsah).
Kvůli limitu 10 přestane MySQL vyhledávat, jakmile bude mít 10 položek, takže se skutečně dívá pouze na 10 záznamů tag_links.Content.id se automaticky zvyšuje, takže vyšší čísla jsou velmi rychlým proxy pro novější články.

V tomto případě nikdy potřebujete hledat něco jiného než rovnost a začnete s 1 tagem, který ekvi-spojíte pomocí celočíselných klíčů (nejrychlejší možné spojení).

Neexistují o tom žádná if-ths-or-buts, toto je nejrychlejší způsob.

Všimněte si, že protože existuje nanejvýš několik 1000 značek, bude jakékoli vyhledávání mnohem rychlejší než procházení celé tabulky obsahu.

Konečně
Pole CSV jsou velmi špatný nápad, nikdy je nepoužívejte v databázi.




  1. Chyba TOP a ORDER BY SQL

  2. Vícerozměrné pole PHP z výsledku mysql

  3. Jak načíst data do textového pole z tabulky databáze SQL

  4. Hibernate, MySQL a tabulka s názvem Repeat – podivné chování