############################################### ############### Завдання ################# ############################################### ################################################ ############### Завдання 1 ################# Для того, щоб швидко вивести інформацію про замовлення було створено такий запит: SELECT * FROM Orders; --------------------------------------------------- 1. Оптимізуйте даний запит, якщо відомо, що потрібна інформація представлена у полях OrderID, ProductID, Quantity та Date. select OrderID, ProductID, Quantity, Date from Orders; ################################################ ############### Завдання 2 ################# Для того, щоб вивести замовлення розміщене клієнтом з ідентифікатором Cl1 було створено наступний запис: SELECT * FROM Orders WHERE ClientID = 'Cl1'; --------------------------------------------------- 1. Виконайте наступний запит, щоб переглянути параметри плану виконання. EXPLAIN SELECT * FROM Orders WHERE ClientID = 'Cl1'; Значення деяких полів: type -- містиь значення ALL, яке свідчить, що для пошуку потрібного значення була просканована уся таблиця. -- це найгірший тип сканування, який зазвичай вказує на відсутність відповідних індексів у таблиці possible_keys -- цей стовпець показує ключі, які може використовувати MySQL для пошуку рядків у таблиці; -- значення стовпця дорівнює NULL, це означає, що відповідні індекси не знайдено. key -- вказує фактичний індекс, який використовує MySQL; -- у нашому видку стовпець містить значення NULL, яке вказує на те, що в таблиці немає ключів або індексів, які MySQL може використовувати для пошуку або фільтрації рядків rows -- кількість опрацьованих рядків для отримання результату Extra --Примітки Ситуацію можна виправити шляхом створення індексу. --------------------------------------------------- 2. З метою оптимізації запиту створіть index з іменем IdxClientID на потрібному полі таблиці Orders. create index IdxClientID on Orders (ClientID); drop index IdxClientID on Orders; --------------------------------------------------- 3.Як тільки індекс буде створено, повторно виконайте той же запит SELECT з операторм EXPLAIN. Порівняйте результати й зробіть висновки. explain select * from Orders where ClientID = 'Cl1'; ################################################ ############### Завдання 3 ################# Для пошуку повної інформації про працівника з прізвищем 'Tolo' було написано такий запит: SELECT * FROM Employees WHERE FullName LIKE '%Tolo'; FullName містить ім’я та прізвище працівника Якщо у стовпці FullName є індекс, то запит не зможе його використати, оскільки в умові пропозиції WHERE він містить на початку груповий символ (%). Для уникнення систуації використання в умові WHERE на початку групового символа (%) виконайте такі кроки: --------------------------------------------------- 1: Додайте новий стовпець ReverseFullName до таблиці Employees. alter table Employees add column ReverseFullName varchar(100) default CONCAT( SUBSTRING_INDEX(FullName, ' ', -1), ' ', SUBSTRING_INDEX(FullName, ' ', 1) ); alter table Employees add column asd integer unique auto_increment primary key; --------------------------------------------------- 2: Заповніть стовпець ReverseFullName значенням з повного імені працівників але у порядку "Прізвище І’мя". select * from Employees; update Employees set ReverseFullName = CONCAT( SUBSTRING_INDEX(FullName, ' ', -1), ' ', SUBSTRING_INDEX(FullName, ' ', 1) ); --------------------------------------------------- 2.1: Перегляньте новостворений стовбець select ReverseFullName from Employees; --------------------------------------------------- 3: Створіть індекс з іменем IdxReverseFullName на основі стовпця ReverseFullName. create index IdxReverseFullName on Employees (ReverseFullName); drop index IdxReverseFullName on Employees; --------------------------------------------------- 4. Перепишіть запит із використанням вже новоствореного стовпця. select * from Employees where ReverseFullName like 'Tolo%'; explain select * from Employees where ReverseFullName like 'Tolo%';