Ето вашите въпроси. множествено число. Като ги префразираме (с "с други думи") те са просто различни въпроси. Това не улеснява непременно отговарящите. Напротив.
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 |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+