प्रदर्शन के लिए, और यह मानते हुए कि आप 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