sql >> Databáze >  >> RDS >> Mysql

Znamená zástupný znak v levém sloupci složeného indexu, že zbývající sloupce v indexu se nepoužívají při vyhledávání indexu (MySQL)?

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 |
+----+-------------+---------+-------+---------------+----------+---------+------+--------+--------------------------+


  1. T-SQL Jak dynamicky vytvářet tabulky v uložených procedurách?

  2. Jak mohu vybrat databázi MySQL pro použití s ​​PDO v PHP?

  3. Můžeme předat parametry pohledu v SQL?

  4. Sjednocení dvou tabulek s různým počtem sloupců