Mysql
 sql >> база данни >  >> RDS >> Mysql

Заместващият знак в най-лявата колона на съставния индекс означава ли, че останалите колони в индекса не се използват при търсене на индекс (MySQL)?

Ето вашите въпроси. множествено число. Като ги префразираме (с "с други думи") те са просто различни въпроси. Това не улеснява непременно отговарящите. Напротив.

Q1:[Въпрос за заглавие] Знак за заместване в най-лявата колона на съставния индекс означава ли, че останалите колони в индекса не се използват при търсене на индекс (MySQL)?

A1:Не, това не означава това.

В2:заместващият знак, използван в условието last_name, означава ли, че условието first_name няма да се използва за по-нататъшно подпомагане на MySQL да намира индекси?

A2:Не, това не означава това. Освен това опашката на този въпрос е двусмислена. Той вече знае какъв индекс да използва, може да бъде един клон на отговор на такава неяснота.

В3:С други думи, чрез поставяне на заместващ знак в условието last_name MySQL ще извърши само частично търсене в индекс (и игнорира условията, дадени в колоните, които са отдясно на фамилия)?

A3:Не. Най-десните колони се обслужват от индекса, подобно на стратегия за покриващ индекс, която се възползва от бавното търсене на страници с данни.

В4:...би ли пример-1 да е по-бърз от пример-2?

A4:Да. Това е покриващ индекс по отношение на тези колони. Вижте покриващите индекси.

Като настрана относно Q4. Няма значение дали е PK или не-PK. Вероятно има дузина причини, поради които това като PK би било ужасно за вашето приложение.

Оригинален(и) отговор(и) по-долу:

с само съставен ключ на (last_name,first_name) и заявка, както споменаваш

WHERE first_name LIKE 'joh%'

... Изобщо няма да използва индекса. Ще направи сканиране на таблицата. Поради липса на

  • единична колона за first_name
  • съставен ключ с first_name най-ляво

Сканиране на таблицата идва.

Моля, вижте страницата наръчник Индекси с няколко колони да прочетете повече. И се съсредоточете върху left-most концепция за него. Всъщност отидете на тази страница и потърсете думата left .

Вижте страницата наръчник на Обяснение съоръжение в mysql. Също така статията Използване на Explain за писане на по-добри 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. MySQL, ако редът съществува, актуализирайте иначе вмъкнете

  4. Как да получите състоянието на MySQL в заявка

  5. MySQL/PDO::quote(), Поставяне на единични кавички около цели числа