Индекстөөнүн өнүккөн стратегиялары
"Кайсы тилкени индекстейм?" деген суроодон "оптимизатор чындыгында кайсы индексти колдонот жана эмне үчүн?" деген суроого
- курама индексти долбоорлоп, эң сол префикс эрежесин колдоно аласыз,
- сурам индекс боюнча гана сканерлөө катары иштеши үчүн жаап турган индекс түзө аласыз,
- селективдүүлүк жөнүндө ой жүгүртүп, оптимизатор эмне үчүн кээде индексти этибарга албашын түшүнөсүз,
- MySQL 8дө функционалдык (туюнтма боюнча) индексти колдоносуз,
- индексти өлтүргөн саргируемый эмес предикаттарды таап, кайра жаза аласыз.
Бул өнүккөн курс: B-дарак индекси издөө менен диапазондук сканерлөөнү тездетээрин, InnoDBде PRIMARY KEY кластердик индекс экенин жана EXPLAIN планын кантип окууну сиз мурунтан билесиз. Биз түз ушунун үстүнө курабыз.
0. Мисал маалымат базасы
Төмөндөгү бардык сурамдар бир кичинекей дүкөн схемасына каршы иштейт. Ар бир таблицада миллиондогон сап бар деп элестетиңиз - индекстөө чоң көлөмдө гана мааниге ээ - бирок жыйынтыктар окумдуу болуш үчүн бир нече сапты гана көрсөтөбүз.
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
last_name VARCHAR(50),
first_name VARCHAR(50),
city VARCHAR(50),
email VARCHAR(120)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
status VARCHAR(20),
total DECIMAL(10,2)
);
INSERT INTO customers VALUES
(1,'Smith','Anna','Berlin','anna@shop.io'),
(2,'Smith','Ben','Berlin','ben@gmail.com'),
(3,'Jones','Cara','Almaty','cara@mail.kg'),
(4,'Adams','Dan','Berlin','dan@gmail.com');
INSERT INTO orders VALUES
(10,1,'2024-02-11','shipped', 42.00),
(11,1,'2024-03-02','shipped', 18.50),
(12,2,'2024-02-20','pending', 99.00),
(13,3,'2023-12-30','shipped', 7.25),
(14,4,'2024-05-05','cancelled',60.00);
Эки таблица, бирден-көпкө байланыш (orders.customer_id дегени customers.customer_idге шилтейт) жана абдан ар түрдүү селективдүүлүктөгү тилкелер: statusта бир нече гана маани, email болсо дээрлик уникалдуу. Экөө тең төмөндө маанилүү.