MySQL में आंतरिक जॉब तालिका में सूचकांक का उपयोग करना



indexing inner-join (1)

यदि आप foo(table_id, sometime) लिए यौगिक अनुक्रमणिका बनाते हैं, तो उसे बहुत मदद करना चाहिए ऐसा इसलिए है क्योंकि सर्वर पहले table_id द्वारा निर्धारित परिणाम को कम करने में सक्षम होगा, और फिर sometime

ध्यान दें कि LIMIT का उपयोग करते समय, सर्वर यह गारंटी नहीं देता कि कौन सी पंक्तियों को आपके WHERE बाधा के लिए अर्हता प्राप्त की जाएंगी। तकनीकी तौर पर, हर निष्पादन आपको थोड़ा अलग परिणाम दे सकता है यदि आप अस्पष्टता से बचना चाहते हैं, तो आपको हमेशा LIMIT उपयोग करते समय ORDER BY उपयोग करना चाहिए। हालांकि, इसका भी मतलब है कि उचित अनुक्रमित बनाने में आपको अधिक सावधानी बरतनी चाहिए।

मेरे पास 200 मिलियन रिकॉर्ड और तालिका बार 1000 रिकॉर्ड के साथ टेबल फू है, वे कई-से-एक के साथ जुड़े हुए हैं। फ़ू सोम टाइम और बार.सोमफिल्ड कॉलम के लिए अनुक्रमित हैं। इसके अलावा बार 900 रिकॉर्डों में कुछ की फ़ील्ड है, 100 में कुछ की फ़ील्ड 2 है

(1) यह क्वेरी तुरंत निष्पादित होती है:

mysql> select * from Foo f inner join Bar b on f.table_id = b.table_id where f.someTime     between '2008-08-14' and '2018-08-14' and b.someField = 1 limit 20;
...
20 rows in set (0.00 sec)

(2) यह केवल हमेशा के लिए लेता है (केवल परिवर्तन b.someField = 2 है):

mysql> select * from Foo f inner join Bar b on f.table_id = b.table_id where f.someTime     between '2008-08-14' and '2018-08-14' and b.someField = 2 limit 20;

(3) लेकिन अगर मैं इसे छोड़ देता हूं, तो उस समय से कुछ समय पर किसी भी तरह से निष्पादित भी होता है:

mysql> select * from Foo f inner join Bar b on f.table_id = b.table_id where b.someField = 2 limit 20;
...
20 rows in set (0.00 sec)

(4) इसके अलावा मैं सूचकांक उपयोग को मजबूती से बढ़ा सकता हूं:

mysql> select * from Foo f inner join Bar b force index(someField) on f.table_id = b.table_id where f.someTime     between '2008-08-14' and '2018-08-14' and b.someField = 2 limit 20;
...
20 rows in set (0.00 sec)

यहां क्वेरी पर समझाया गया है (2) (जो हमेशा के लिए लेता है)

+----+-------------+-------+--------+-------------------------------+-----------+---------+--------------------------+----------+-------------+
| id | select_type | table | type   | possible_keys                 | key       | key_len | ref                      | rows     | Extra       |
+----+-------------+-------+--------+-------------------------------+-----------+---------+--------------------------+----------+-------------+
|  1 | SIMPLE      | g     | range  | bar_id,bar_id_2,someTime      | someTime  | 4       | NULL                     | 95022220 | Using where |
|  1 | SIMPLE      | t     | eq_ref | PRIMARY,someField,bar_id      | PRIMARY   | 4       | db.f.bar_id              |        1 | Using where |
+----+-------------+-------+--------+-------------------------------+-----------+---------+--------------------------+----------+-------------+

यहाँ पर व्याख्या (4) है (जो बल सूचकांक है)

+----+-------------+-------+------+-------------------------------+-----------+---------+--------------------------+----------+-------------+
| id | select_type | table | type | possible_keys                 | key       | key_len | ref                      | rows     | Extra       |
+----+-------------+-------+------+-------------------------------+-----------+---------+--------------------------+----------+-------------+
|  1 | SIMPLE      | t     | ref  | someField                     | someField | 1       |   const                  |       92 |             |
|  1 | SIMPLE      | g     | ref  | bar_id,bar_id_2,someTime      | bar_id    | 4       | db.f.foo_id              | 10558024 | Using where |
+----+-------------+-------+------+-------------------------------+-----------+---------+--------------------------+----------+-------------+

तो सवाल यह है कि कैसे सही सूचकांक का उपयोग करने के लिए MySQL को पढ़ाना है? क्वेरी ओआरएम द्वारा उत्पन्न होती है और केवल इन दो क्षेत्रों तक ही सीमित नहीं होती है। और यह भी क्वेरी को बदलने से बचने के लिए अच्छा होगा (हालांकि मुझे यकीन नहीं है कि आंतरिक प्रवेश यहां फिट बैठता है)

अद्यतन करें:

mysql> create index index_name on Foo (bar_id, someTime);

उसके बाद क्वेरी (2) 0.00 सेकंड में कार्यान्वित करता है।





large-data