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

डीबी में दूरी मैट्रिक्स संग्रहित करना

प्रदर्शन के लिए, और यह मानते हुए कि आप InnoDB का उपयोग कर रहे हैं, मैं शायद डेटा को इस तरह से थोड़ा सा निरूपित करूँगा:

CREATE TABLE CITY (
    CITY_ID INT PRIMARY KEY
);

CREATE TABLE CITY_DISTANCE (
    CITY1_ID INT,
    CITY2_ID INT,
    DISTANCE NUMERIC NOT NULL,
    PRIMARY KEY (CITY1_ID, DISTANCE, CITY2_ID),
    FOREIGN KEY (CITY1_ID) REFERENCES CITY (CITY_ID),
    FOREIGN KEY (CITY2_ID) REFERENCES CITY (CITY_ID)
);

शहरों की प्रत्येक जोड़ी में CITY_DISTANCE की 2 पंक्तियाँ हैं जिनमें समान DISTANCE (प्रत्येक दिशा के लिए एक) है। यह स्पष्ट रूप से इसे बहुत बड़ा बना सकता है और डेटा विसंगतियों को जन्म दे सकता है (डेटाबेस समान शहरों के बीच गैर-मिलान DISTANCE मानों से अपना बचाव नहीं करेगा), और DISTANCE तार्किक रूप से PK से संबंधित नहीं है, लेकिन मेरे साथ है ...

InnoDB टेबल क्लस्टर किए गए हैं , जिसका अर्थ है कि पीके को इस विशेष तरीके से घोषित करके हमने पूरी तालिका को बी-ट्री में रखा है जो विशेष रूप से इस तरह की क्वेरी के लिए उपयुक्त है:

SELECT CITY2_ID, DISTANCE
FROM CITY_DISTANCE
WHERE CITY1_ID = 1
ORDER BY DISTANCE
LIMIT 5

यह क्वेरी 1 . द्वारा पहचाने गए शहर के निकटतम 5 शहरों को लौटाती है , और ऊपर उल्लिखित बी-ट्री पर एक साधारण रेंज स्कैन द्वारा संतुष्ट किया जा सकता है:

id  select_type table           type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      CITY_DISTANCE   ref     PRIMARY         PRIMARY 4       const   6       "Using where; Using index"

BTW, InnoDB दूसरे FK के कारण स्वचालित रूप से एक और इंडेक्स (CITY2_ID पर) बनाएगा, जिसमें CITY1_ID और DISTANCE भी शामिल होंगे क्योंकि क्लस्टर टेबल में सेकेंडरी इंडेक्स में PK को कवर करना होगा। आप डुप्लिकेट DISTANCEs (स्पष्ट रूप से {CITY2_ID, DISTANCE, CITY1_ID} पर इंडेक्स बनाएं और FK को इसका पुन:उपयोग करने दें, और CHECK (CITY1_ID

  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 एकाधिक तालिकाओं को क्वेरी कर रहा है

  3. सम्मिलन के एक घंटे बाद का दिनांक समय। दिन के उजाले की बचत

  4. 1366 त्रुटि प्राप्त करना गलत पूर्णांक मान:'1' फ़ाइल आयात करते समय

  5. दो चुनिंदा विकल्पों द्वारा परिणामों को फ़िल्टर करना