sql >> Databasteknik >  >> RDS >> Mysql

Bästa sättet att lagra taggar för hastighet i enorma bord

FULLTEXT-index är verkligen inte så snabba som du kanske tror att de är.

Använd en separat tabell för att lagra dina taggar:

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
......

Du VÄLJER allt innehåll med taggen x genom att använda:

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;

På grund av den främmande nyckeln indexeras alla fält i tag_links individuellt.
WHERE-taggarna ='test' väljer 1 (!) post.
Equi-ansluter till detta med 10 000 taglänkar.
Och Equi-ansluter det med 1 innehållspost vardera (varje tag_link pekar bara på 1 innehåll).
På grund av gränsen 10 kommer MySQL att sluta leta så fort den har 10 objekt, så den tittar egentligen bara på 10 tag_links-poster.
Content.id ökar automatiskt, så högre siffror är mycket snabb proxy för nyare artiklar.

I det här fallet du aldrig behöver leta efter något annat än jämlikhet och du börjar med 1 tagg som du equi-join med hjälp av heltalsnycklar (snabbaste möjliga join).

Det finns inga om-då-eller-men om det, detta är det snabbaste sättet.

Observera att eftersom det finns högst några 1000 taggar, kommer alla sökningar att gå mycket snabbare än att gräva i den fullständiga innehållstabellen.

Äntligen
CSV-fält är en mycket dålig idé, använd då aldrig i en databas.




  1. Golang Infoga NULL i sql istället för tom sträng

  2. Returnera alla rader från en specifik partition i SQL Server (T-SQL)

  3. PDOException "kunde inte hitta drivrutinen" i php

  4. fråga för att visa fyra slumpmässiga data från databasen