Zde jsou vaše otázky. Množný. Tím, že je přeformulujete (jinými slovy), jsou to jen jiné otázky. Pokud tak učiníte, respondentům to nutně neusnadní. Naopak.
Q1:[Otázka v názvu] Znamená zástupný znak v levém sloupci složeného indexu, že zbývající sloupce v indexu nejsou použity při vyhledávání indexu (MySQL)?
A1:Ne, to neznamená.
Otázka 2:Znamená zástupný znak použitý v podmínce last_name, že podmínka first_name nebude dále používat MySQL při hledání indexů?
A2:Ne, to neznamená. Navíc konec té otázky je nejednoznačný. Už ví, jaký Index použít, by mohl být jednou z vedlejších odpovědí na takovou vágnost.
Otázka 3:Jinými slovy, vložením zástupného znaku do podmínky příjmení provede MySQL pouze částečné vyhledávání indexu (a ignoruje podmínky uvedené ve sloupcích vpravo od příjmení)?
Odpověď 3:Ne. Sloupce úplně vpravo jsou obsluhovány z indexu podobně jako strategie pokrývající index, která těží z pomalého vyhledávání datových stránek.
Q4:...byl by Příklad-1 rychlejší než Příklad-2?
A4:Ano. Je to krycí index s ohledem na tyto sloupce. Viz krycí rejstříky.
Jako stranou k Q4. Je irelevantní, zda se jedná o PK nebo nePK. Existuje pravděpodobně tucet důvodů, proč by to jako PK bylo pro vaši aplikaci hrozné.
Původní odpověď (odpovědi) níže:
pouze složený klíč na (last_name,first_name)
a dotaz, jak uvádíte
WHERE first_name LIKE 'joh%'
... Nepoužije index vůbec. Provede skenování tabulky. Vzhledem k absenci
- jeden klíč sloupce na
first_name
- složený klíč s
first_name
zcela vlevo
Takže prohledejte tabulku, jsme tady.
Přečtěte si prosím manuálovou stránku Indexy s více sloupci přečíst více. A zaměřte se na left-most
koncept toho. Ve skutečnosti přejděte na tuto stránku a vyhledejte slovo left
.
Viz manuálovou stránku na Vysvětlení zařízení v mysql. Také článek Using Explain to Write Better Mysql Queries .
Upravit
Od té doby, co jsem tu byl před hodinou nebo dvěma, bylo v otázce provedeno několik úprav. Nechám vás s následujícím. Spusťte svůj skutečný dotaz prostřednictvím vysvětlení a dešifrujte ho pomocí Using Explain ...
odkaz výše nebo jiný odkaz
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
vykreslí čísla voodoo pro rows
. Voodoo? Ano, protože dotaz, který bude potenciálně běžet hodinu, se ptáte explain
aby vám poskytl fuzzy počet, nespustil jej a dal vám tuto odpověď za 2 sekundy nebo méně. Nepovažujte je za skutečný počet # pro kritéria, když je spuštěn reálně, bez 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 |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+