Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

विशाल तालिका में गति के लिए टैग स्टोर करने का सबसे अच्छा तरीका

FULLTEXT अनुक्रमणिका वास्तव में उतनी तेज़ नहीं हैं जितनी आप सोच सकते हैं।

अपने टैग संग्रहीत करने के लिए एक अलग तालिका का उपयोग करें:

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

आप टैग x के साथ सभी सामग्री का उपयोग करके चयन करते हैं:

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;

विदेशी कुंजी के कारण, tag_links में सभी फ़ील्ड व्यक्तिगत रूप से अनुक्रमित होते हैं।
`WHERE टैग ='परीक्षण' 1 (!) रिकॉर्ड का चयन करता है।
इसी को 10,000 टैगलिंक के साथ जोड़ता है।
और इक्वि-जॉइन कि प्रत्येक 1 सामग्री रिकॉर्ड के साथ (प्रत्येक टैग_लिंक केवल कभी 1 सामग्री की ओर इशारा करता है)।
10 की सीमा के कारण, जैसे ही MySQL में 10 आइटम होंगे, यह दिखना बंद हो जाएगा, इसलिए यह वास्तव में केवल 10 टैग_लिंक रिकॉर्ड को देखता है।
Content.id स्वत:वृद्धिशील है, इसलिए नए लेखों के लिए उच्च संख्याएं बहुत तेज़ प्रॉक्सी हैं।

इस मामले में आप कभी नहीं समानता के अलावा कुछ भी देखने की जरूरत है और आप 1 टैग से शुरू करते हैं जिसे आप पूर्णांक कुंजियों (सबसे तेज़ संभव शामिल) का उपयोग करके समान रूप से शामिल होते हैं।

इसके बारे में अगर-तब-लेकिन-लेकिन नहीं हैं, यह सबसे तेज़ तरीका है।

ध्यान दें कि क्योंकि कम से कम 1000 टैग हैं, कोई भी खोज पूर्ण सामग्री तालिका में खोज करने की तुलना में बहुत तेज होगी।

आखिरकार
सीएसवी फ़ील्ड एक बहुत बुरा विचार है, डेटाबेस में कभी भी इसका उपयोग न करें।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL लेनदेन में विलंबता को संभालना

  2. यूनियन (Mysql) पर ORDER BY लागू करें

  3. क्या मैं COUNT () और DISTINCT का एक साथ उपयोग कर सकता हूँ?

  4. पायथन 3.x के लिए MySQL-db lib?

  5. संदेश को कैसे ठीक करें:SQLSTATE [08004] [1040] बहुत अधिक कनेक्शन