[[oktatas:adatbazis-kezeles:mariadb:sql|< SQL]] ====== Optimalizálás ====== * **Szerző:** Sallai András * Copyright (c) 2019, Sallai András * Szerkesztve: 2019, 2021 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Az optimalizálásról ===== Amivel optimalizálhatunk: * indexelés * lekérdezés változtatása * például: több feltétel * adatszerkezet módosítása * megfelelő mezőtípusok választása ===== Az indexekről ===== Az indexek négy fő típusa: * elsődleges kulcs (egyedi és nem null) * egyedi index (egyedi és lehet null is) * egyszerű indexek (nem feltétlenül egyedi) * teljes szöveges (keresés szövegben) A kulcs és az index elnevezéseket általában felcserélhetően használják. ===== Indexelés ===== A lekérdezések során, ha egy oszlop indexelve van, segíti a keresett érték megtalálását. Minden oszlopot viszont mégsem indexelünk, mert az meg lassítja az adatok írását. Mit indexeljünk? * Azokat az oszlopokat, amelyek sokszor szerepelnek egy lekérdezés WHERE záradékában. ===== Index készítése ===== Szintaxis ((A create index teljes szintaxisa: https://mariadb.com/kb/en/create-index/)): Index létrehozása: CREATE [OR REPLACE] [UNIQUE|FULLTEXT|SPATIAL] INDEX [IF NOT EXISTS] indexnév [index_típusa] ON táblanév (mezőnév, ...) Index törlése: DROP INDEX [IF EXISTS] indexnév ON táblanév Index típusok: * normál -- nem egyedi értékekre is használható - B-fa-t (B-tree) hoz létre * unique -- csak egyedi értékek lehetnek, nem lehet null * fulltext -- keresés szövegben - speciális keresőmotor működik * spatial -- koordinátarendszerek számára - R-fa-t (R-tree) hoz létre * térbeli objektumok tárolása * pontok, téglalapok, sokszögek rendezésére javasolt Index tárolás típusa: USING {BTREE | HASH | RTREE} Index létrehozása: create index nev_index on dolgozok(nev); Indexek lekérdezése: show indexes from dolgozok\G Az index törlése: drop index nev_index on dolgozok; create index telepules_index2 using btree on dolgozok(telepules); ===== Gyakorlat 01 ===== Készítse el a következő adatbázist. create database domosbt character set utf8 collate utf8_hungarian_ci; grant all privileges on domosbt.* to domosbt@localhost identified by 'titok'; use domosbt; create table dolgozok( az int not null primary key auto_increment, nev varchar(50), telepules varchar(50), fizetes double, jutalom double, belepes date ); insert into dolgozok (nev, telepules, fizetes, jutalom, belepes) values ('Prank Attila', 'Szeged', 2875000, 112000, '2000-01-01'), ('Lant Erzsébet', 'Szolnok', 2942000, 50000, '2000-02-01'); - Hozzon létre egy egyszerű indexet netto mezőre. ===== VIEW ===== A nézettáblák nem optimalizálják a lekérdezést, maximum átláthatóbbá teszik. Szintaxis ((A create view szintaxis teljes leírása: https://mariadb.com/kb/en/create-view/)): CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW [IF NOT EXISTS] nézetnév [(column_list)] AS select_utasítás Legyen egy dolgozok tábla: create table dolgozok( az int not null primary key auto_increment, nev varchar(50), anyjaneve varchar(50), telepules varchar(50), cim varchar(50), netto double, juttatas double, belepes date, szuletes date, szulhely varchar(50) ); Nézet létrehozása: create view simp as select nev, telepules, netto from dolgozok; A táblák között látszanak a nézetek: show tables; A létrehozott nézetről: show create view simp \G ===== EXPLAIN ===== Az explain ((Több információ az explainról: https://mariadb.com/kb/en/explain/)) SQL utasítást nem hajtja végre, helyette analizálja. Példa adatbázis: create database fer character set utf8 collate utf8_hungarian_ci; grant all privileges on fer.* to fer@localhost identified by 'titok'; use fer; create table dolgozok( az int not null primary key, nev varchar(50), telepules varchar(50), fizetes double ); insert into dolgozok values (1,'Pardon Béla','Szolnok',2837000), (2,'Lovas Beáta','Szeged',870500), (3,'Pedro Péter','Szolnok',2837000), (4,'Ton Irén','Szeged',2837000), (5,'Frank Olivér','Szolnok',2837000), (6,'Lapos Bence','Miskolc',2837000), (7,'Kerek Katalin','Miskolc',1870000), (8,'Pardon Béla','Hatvan',1537000), (9,'Pardon Béla','Szeged',1400000); Kérdezzük le a dolgozók táblát: MariaDB [fer]> select * from dolgozok; +----+---------------+-----------+---------+ | az | nev | telepules | fizetes | +----+---------------+-----------+---------+ | 1 | Pardon Béla | Szolnok | 2837000 | | 2 | Lovas Beáta | Szeged | 870500 | | 3 | Pedro Péter | Szolnok | 2837000 | | 4 | Ton Irén | Szeged | 2837000 | | 5 | Frank Olivér | Szolnok | 2837000 | | 6 | Lapos Bence | Miskolc | 2837000 | | 7 | Kerek Katalin | Miskolc | 1870000 | | 8 | Pardon Béla | Hatvan | 1537000 | | 9 | Pardon Béla | Szeged | 1400000 | +----+---------------+-----------+---------+ 9 rows in set (0.000 sec) Példa: explain select * from dolgozok; Kimenettel MariaDB [fer]> explain select * from dolgozok; +------+-------------+----------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+----------+------+---------------+------+---------+------+------+-------+ | 1 | SIMPLE | dolgozok | ALL | NULL | NULL | NULL | NULL | 9 | | +------+-------------+----------+------+---------------+------+---------+------+------+-------+ 1 row in set (0.000 sec) Mivel nem volt szűrés az összes táblán végigment a select. Lássuk szűréssel: MariaDB [fer]> explain select * from dolgozok where telepules="Szeged"; +------+-------------+----------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+----------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | dolgozok | ALL | NULL | NULL | NULL | NULL | 9 | Using where | +------+-------------+----------+------+---------------+------+---------+------+------+-------------+ 1 row in set (0.000 sec) Így is végignézte az összes rekordot. Most adjunk a telepules táblához indexet: MariaDB [fer]> create index telepules_index on dolgozok(telepules); Query OK, 0 rows affected (0.046 sec) Records: 0 Duplicates: 0 Warnings: 0 Elemezzük újra a lekérdezést: MariaDB [fer]> explain select * from dolgozok where telepules="Szeged"; +------+-------------+----------+------+-----------------+-----------------+---------+-------+------+-----------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+----------+------+-----------------+-----------------+---------+-------+------+-----------------------+ | 1 | SIMPLE | dolgozok | ref | telepules_index | telepules_index | 53 | const | 3 | Using index condition | +------+-------------+----------+------+-----------------+-----------------+---------+-------+------+-----------------------+ 1 row in set (0.001 sec) Ha megnézzük a rows oszlopot, láthatjuk, most már csak 3 sort dolgozott fel. ===== Linkek ===== * https://mariadb.com/kb/en/the-essentials-of-an-index/ (2021) * https://mariadb.com/kb/en/getting-started-with-indexes/ (2021) * https://mariadb.com/kb/en/create-index/ (2021)