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

क्या कंपोजिट इंडेक्स के सबसे बाएं कॉलम में वाइल्डकार्ड का मतलब है कि इंडेक्स में शेष कॉलम इंडेक्स लुकअप (MySQL) में उपयोग नहीं किए जाते हैं?

यहां आपके प्रश्न हैं। बहुवचन। उन्हें फिर से लिखना ("दूसरे शब्दों में" के साथ) वे सिर्फ अलग प्रश्न हैं। ऐसा करने से उत्तरदाताओं के लिए यह आवश्यक रूप से आसान नहीं हो जाता है। इसके विपरीत।

Q1:[शीर्षक प्रश्न] क्या संयुक्त इंडेक्स के सबसे बाएं कॉलम में वाइल्डकार्ड का मतलब है कि इंडेक्स में शेष कॉलम इंडेक्स लुकअप (MySQL) में उपयोग नहीं किए जाते हैं?

A1:नहीं, इसका मतलब यह नहीं है।

Q2:क्या लास्ट_नाम कंडीशन में इस्तेमाल किए गए वाइल्डकार्ड का मतलब है कि MySQL को इंडेक्स खोजने में मदद करने के लिए फर्स्ट_नाम कंडीशन का इस्तेमाल नहीं किया जाएगा?

A2:नहीं, इसका मतलब यह नहीं है। साथ ही उस प्रश्न की पूंछ अस्पष्ट है। यह पहले से ही जानता है कि किस इंडेक्स का उपयोग करना है, इस तरह की अस्पष्टता का एक ऑफशूट उत्तर हो सकता है।

Q3:दूसरे शब्दों में, लास्ट_नाम कंडीशन पर वाइल्डकार्ड लगाकर MySQL केवल आंशिक इंडेक्स लुकअप करेगा (और कॉलम में दी गई शर्तों को अनदेखा करता है जो last_name के दाईं ओर हैं)?

A3:नहीं। डेटा पेज लुकअप की धीमी गति से लाभान्वित होने वाली कवरिंग इंडेक्स रणनीति के समान सबसे दाहिने कॉलम को इंडेक्स से परोसा जाता है।

Q4:...क्या उदाहरण-1, उदाहरण-2 से तेज होगा?

ए 4:हाँ। यह उन कॉलमों के संबंध में एक कवरिंग इंडेक्स है। कवरिंग इंडेक्स देखें।

Q4 के विषय में एक तरफ के रूप में। यह अप्रासंगिक है अगर यह पीके या गैर-पीके है। शायद एक दर्जन कारण हैं कि एक पीके के रूप में आपके आवेदन के लिए भयानक होगा।

मूल उत्तर नीचे दिए गए हैं:

केवल . के साथ (last_name,first_name) . पर एक संयुक्त कुंजी और एक प्रश्न जैसा कि आपने उल्लेख किया है

WHERE first_name LIKE 'joh%'

... यह सूचकांक का बिल्कुल भी उपयोग नहीं करेगा। यह एक टेबल स्कैन करेगा।

. की अनुपस्थिति के कारण
  • एक एकल स्तंभ कुंजी first_name . पर
  • first_name के साथ एक संयुक्त कुंजी सबसे बाएं

तो टेबल स्कैन यहां आ गया है।

कृपया मैनुअल पेज देखें मल्टीपल-कॉलम इंडेक्स ए> अधिक पढ़ने के लिए। और left-most पर ध्यान केंद्रित करें इसकी अवधारणा। वास्तव में, उस पृष्ठ पर जाएं, और left शब्द पर खोजें ।

व्याख्या पर मैनुअल पेज देखें। mysql में सुविधा। साथ ही लेख बेहतर Mysql क्वेरी लिखने के लिए व्याख्या का उपयोग करना ए> ।

संपादित करें

जब से मैं यहां एक या दो घंटे पहले आया था, तब से इस प्रश्न में कुछ संपादन हुए हैं। मैं आपको निम्नलिखित के साथ छोड़ दूंगा। व्याख्या के माध्यम से अपनी वास्तविक क्वेरी चलाएँ, और Using Explain ... के माध्यम से समझें उपरोक्त लिंक या कोई अन्य संदर्भ

drop table myNames;
create table myNames
(   id int auto_increment primary key,
    lastname varchar(100) not null,
    firstname varchar(100) not null,
    col4 int not null,
    key(lastname,firstname)
);
truncate table myNames;
insert myNames (lastName,firstName,col4) values
('Smith','John',1),('Smithers','JohnSomeone',1),('Smith3','John4324',1),('Smi','Jonathan',1),('Smith123x$FA','Joh',1),('Smi3jfif','jkdid',1),('r3','fe2',1);

insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;
insert myNames (lastName,firstName,col4) select lastname,firstname,col4 from mynames;

select count(*) from myNames; 
-- 458k rows

select count(*)
from myNames
where lastname like 'smi%';
-- 393216 rows

select count(*)
from myNames
where lastname like 'smi%' and firstname like 'joh%';
-- 262144 rows

Explain rows . के लिए वूडू नंबर प्रदान करता है . वूडू? हां, क्योंकि एक प्रश्न जो संभावित रूप से एक घंटे तक चलेगा, आप पूछ रहे हैं explain आपको अस्पष्ट गणना देने के लिए, इसे चलाने के लिए नहीं, और 2 सेकंड या उससे कम समय में आपको वह उत्तर देने के लिए। बिना explain के, जब इसे वास्तविक रूप से चलाया जाता है, तो मानदंड के लिए इन्हें वास्तविक गणना न मानें। ।

explain 
select count(*) 
from myNames 
where lastname like 'smi%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 302     | NULL | 233627 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+

explain 
select count(*) 
from myNames 
where lastname like 'smi%' and firstname like 'joh%' and col4=1;
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 604     | NULL | 233627 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


-- the below chunk is interest. Look at the Extra column

explain 
select count(*) 
from myNames 
where lastname like 'smi%' and firstname like 'joh%' and col4=1;
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table   | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | myNames | ALL  | lastname      | NULL | NULL    | NULL | 457932 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+--------+-------------+

explain 
select count(*) 
from myNames 
where firstname like 'joh%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | index | NULL          | lastname | 604     | NULL | 453601 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


analyze table myNames;
+----------------------+---------+----------+----------+
| Table                | Op      | Msg_type | Msg_text |
+----------------------+---------+----------+----------+
| so_gibberish.mynames | analyze | status   | OK       |
+----------------------+---------+----------+----------+

select count(*) 
from myNames where left(lastname,3)='smi';
-- 393216 -- the REAL #
select count(*) 
from myNames where left(lastname,3)='smi' and left(firstname,3)='joh';
-- 262144 -- the REAL #

explain 
select lastname,firstname 
from myNames  
where lastname like 'smi%' and firstname like 'joh%';
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
| id | select_type | table   | type  | possible_keys | key      | key_len | ref  | rows   | Extra                    |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | myNames | range | lastname      | lastname | 604     | NULL | 226800 | Using where; Using index |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


  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. डेटाबेस बनाम फाइल सिस्टम में फाइलों को स्टोर करना

  3. क्या आपको उनके बचने के लिए तैयार बयानों का उपयोग करना चाहिए?

  4. कमांड निष्पादन के दौरान गंभीर त्रुटि आई। सी # में जब मैं सम्मिलित करें का उपयोग करता हूं

  5. कई स्तंभों द्वारा PHP MySQL आदेश