first commit
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
###############################################
|
||||
############### Завдання #################
|
||||
###############################################
|
||||
|
||||
################################################
|
||||
############### Завдання 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%';
|
||||
@@ -0,0 +1,316 @@
|
||||
|
||||
SELECT statement optimization in MySQL
|
||||
Оптимізація пропозиції SELECT
|
||||
|
||||
У цій роботі слід застосувати техніки оптимізації запитів на основі оператора SELECT, а також побудувати індекси на основі стовпців для прискорення виконання запитів.
|
||||
У роботі буде використано базу даних Lucky_Shrub. Слід оптимізувати запити, які звертаються до таблиць працівників (Employees) та замовлень (Orders).
|
||||
|
||||
Таблиця Orders містить таку інформацію:
|
||||
OrderID - ідентифікатор замовлення
|
||||
ClientID - ідентифікатор клієнта
|
||||
ProductID - ідентифікатор продукту
|
||||
Quantity - кількість одиниць продукту
|
||||
Cost - вартість замовлення
|
||||
Date - дата кожного замовлення
|
||||
|
||||
Таблиця Employees містить таку інформацію
|
||||
EmployeeID - ідентифікатор працівника
|
||||
FullName - повне ім’я працівника (містить, власне, ім’я та прізвище)
|
||||
Role - роль працівника
|
||||
Department - відділ працівника
|
||||
|
||||
Передумови
|
||||
1: Створити базу даних, якщо не створено
|
||||
CREATE DATABASE Lucky_Shrub;
|
||||
|
||||
2: Використати базу даних
|
||||
|
||||
USE Lucky_Shrub;
|
||||
|
||||
3: Створити таблицю Orders (якщо не створено;
|
||||
|
||||
якщо створено, тоді перевірити правильність схеми таблиці)
|
||||
|
||||
CREATE TABLE Orders (
|
||||
OrderID INT NOT NULL,
|
||||
ClientID VARCHAR(10) DEFAULT NULL,
|
||||
ProductID VARCHAR(10) DEFAULT NULL,
|
||||
Quantity INT DEFAULT NULL,
|
||||
Cost DECIMAL(6, 2) DEFAULT NULL,
|
||||
Date DATE DEFAULT NULL,
|
||||
PRIMARY KEY (OrderID)
|
||||
);
|
||||
|
||||
Для перевірки схеми можна використати команду
|
||||
SHOW CREATE TABLE Orders;
|
||||
|
||||
4: Створити таблицю Employees (якщо не створено;
|
||||
|
||||
якщо створено, тоді перевірити правильність схеми таблиці)
|
||||
|
||||
CREATE TABLE Employees (
|
||||
EmployeeID INT DEFAULT NULL,
|
||||
FullName VARCHAR(100) DEFAULT NULL,
|
||||
Role VARCHAR(50) DEFAULT NULL,
|
||||
Department VARCHAR(255) DEFAULT NULL
|
||||
);
|
||||
|
||||
Для перевірки схеми можна використати команду
|
||||
SHOW CREATE TABLE Orders;
|
||||
|
||||
5: Вставте дані у таблицю Orders (якщо дані у таблиці є, перевірте чи відповідають вони запропонованим, за потреби підкоригуйте)
|
||||
|
||||
INSERT INTO
|
||||
Orders (
|
||||
OrderID,
|
||||
ClientID,
|
||||
ProductID,
|
||||
Quantity,
|
||||
Cost,
|
||||
Date
|
||||
)
|
||||
VALUES (
|
||||
1,
|
||||
"Cl1",
|
||||
"P1",
|
||||
10,
|
||||
500,
|
||||
"2020-09-01"
|
||||
),
|
||||
(
|
||||
2,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
100,
|
||||
"2020-09-05"
|
||||
),
|
||||
(
|
||||
3,
|
||||
"Cl3",
|
||||
"P3",
|
||||
20,
|
||||
800,
|
||||
"2020-09-03"
|
||||
),
|
||||
(
|
||||
4,
|
||||
"Cl4",
|
||||
"P4",
|
||||
15,
|
||||
150,
|
||||
"2020-09-07"
|
||||
),
|
||||
(
|
||||
5,
|
||||
"Cl3",
|
||||
"P3",
|
||||
10,
|
||||
450,
|
||||
"2020-09-08"
|
||||
),
|
||||
(
|
||||
6,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
800,
|
||||
"2020-09-09"
|
||||
),
|
||||
(
|
||||
7,
|
||||
"Cl1",
|
||||
"P4",
|
||||
22,
|
||||
1200,
|
||||
"2020-09-10"
|
||||
),
|
||||
(
|
||||
8,
|
||||
"Cl3",
|
||||
"P1",
|
||||
15,
|
||||
150,
|
||||
"2020-09-10"
|
||||
),
|
||||
(
|
||||
9,
|
||||
"Cl1",
|
||||
"P1",
|
||||
10,
|
||||
500,
|
||||
"2020-09-12"
|
||||
),
|
||||
(
|
||||
10,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
100,
|
||||
"2020-09-13"
|
||||
),
|
||||
(
|
||||
11,
|
||||
"Cl1",
|
||||
"P2",
|
||||
15,
|
||||
80,
|
||||
"2020-09-12"
|
||||
),
|
||||
(
|
||||
12,
|
||||
"Cl1",
|
||||
"P1",
|
||||
10,
|
||||
500,
|
||||
"2022-09-01"
|
||||
),
|
||||
(
|
||||
13,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
100,
|
||||
"2022-09-05"
|
||||
),
|
||||
(
|
||||
14,
|
||||
"Cl3",
|
||||
"P3",
|
||||
20,
|
||||
800,
|
||||
"2022-09-03"
|
||||
),
|
||||
(
|
||||
15,
|
||||
"Cl4",
|
||||
"P4",
|
||||
15,
|
||||
150,
|
||||
"2022-09-07"
|
||||
),
|
||||
(
|
||||
16,
|
||||
"Cl3",
|
||||
"P3",
|
||||
10,
|
||||
450,
|
||||
"2022-09-08"
|
||||
),
|
||||
(
|
||||
17,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
800,
|
||||
"2022-09-09"
|
||||
),
|
||||
(
|
||||
18,
|
||||
"Cl1",
|
||||
"P4",
|
||||
22,
|
||||
1200,
|
||||
"2022-09-10"
|
||||
),
|
||||
(
|
||||
19,
|
||||
"Cl3",
|
||||
"P1",
|
||||
15,
|
||||
150,
|
||||
"2022-09-10"
|
||||
),
|
||||
(
|
||||
20,
|
||||
"Cl1",
|
||||
"P1",
|
||||
10,
|
||||
500,
|
||||
"2022-09-12"
|
||||
),
|
||||
(
|
||||
21,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
100,
|
||||
"2022-09-13"
|
||||
),
|
||||
(
|
||||
22,
|
||||
"Cl2",
|
||||
"P1",
|
||||
10,
|
||||
500,
|
||||
"2021-09-01"
|
||||
),
|
||||
(
|
||||
23,
|
||||
"Cl2",
|
||||
"P2",
|
||||
5,
|
||||
100,
|
||||
"2021-09-05"
|
||||
),
|
||||
(
|
||||
24,
|
||||
"Cl3",
|
||||
"P3",
|
||||
20,
|
||||
800,
|
||||
"2021-09-03"
|
||||
),
|
||||
(
|
||||
25,
|
||||
"Cl4",
|
||||
"P4",
|
||||
15,
|
||||
150,
|
||||
"2021-09-07"
|
||||
),
|
||||
(
|
||||
26,
|
||||
"Cl1",
|
||||
"P3",
|
||||
10,
|
||||
450,
|
||||
"2021-09-08"
|
||||
),
|
||||
(
|
||||
27,
|
||||
"Cl2",
|
||||
"P1",
|
||||
20,
|
||||
1000,
|
||||
"2022-09-01"
|
||||
),
|
||||
(
|
||||
28,
|
||||
"Cl2",
|
||||
"P2",
|
||||
10,
|
||||
200,
|
||||
"2022-09-05"
|
||||
),
|
||||
(
|
||||
29,
|
||||
"Cl3",
|
||||
"P3",
|
||||
20,
|
||||
800,
|
||||
"2021-09-03"
|
||||
);
|
||||
|
||||
5: Імпортуйте дані у таблицю Employees скориставшись файлом MS Excel (https://docs.google.com/spreadsheets/d/14KHqSVEqqvaPXSRSlJdHwMUJlBt6VBtr?rtpof=true&authuser=yuriy.kotsyuk%40oa.edu.ua&usp=drive_fs). Для цього здійсніть експорт даних у формат csv з екселівського файлу, після чого здійсніть імпорт у таблицю бази даних.
|
||||
|
||||
LOAD DATA INFILE '/var/lib/mysql-files/Employees.csv' INTO
|
||||
TABLE Employees FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES (
|
||||
EmployeeID,
|
||||
FullName,
|
||||
Role,
|
||||
Department,
|
||||
@dummy
|
||||
);
|
||||
|
||||
Перевірте наявність даних після операції імпорту
|
||||
Reference in New Issue
Block a user