| Здравствуйте.
Пожалуйста, помогите разобраться с оптимизацией базы данных. Всё дело в том, что я впервые сталкиваюсь с большими таблицами (более 13.000 тыс. записей) и поэтому не знаю, как правильно использовать индексы и другие возможности оптимизации. Теории я прочитал много, у меня несколько книг авторов данного форума, но к сожалению, без практики я никак не могу справиться с сложившейся ситуацией. Вся проблема в том, что я отслеживаю статистику "Мудленных SQL-запросов" на хостинге и ситуация складывается таким образом, что на выполнение определённого запроса из базы уходит иногда больше чем 50 сек., хотя допускается до 15 сек. не больше. Из-за этого могут отключить сайт. Вот поэтому я прошу помощи на этом форуме, т.к. всегда её здесь получал.
Вот структура базы данных:
(в данной таблице хранятся все товары интернет-магазина компьютерной техники www.itproduct.ru)
CREATE TABLE itproduct
(
id_goods SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
articul MEDIUMINT UNSIGNED NOT NULL (меньший тип данных нельзя использовать),
name TEXT NOT NULL,
dop_name TEXT,
price_new FLOAT DEFAULT NULL,
price_old FLOAT NOT NULL,
flagshare TINYINT UNSIGNED,
flagspec TINYINT UNSIGNED,
flagnews TINYINT UNSIGNED,
img TINYTEXT DEFAULT NULL,
other TEXT DEFAULT NULL,
id_group SMALLINT UNSIGNED NOT NULL,
position TINYTEXT NOT NULL,
PRIMARY KEY (id_goods)
);
|
Назначение полей:
id_goods - порядковый номер товаров,
articul - артикул товара (пример 188779),
name - название товара,
dop_name - дополнительное описание товара, может отсутствовать (NULL),
price_new - новая цена товара,
price_old - старая цена товара,
-------------------------------------------------------------
flagshare - флаг акции (принимает либо 0 либо 1),
flagspec - флаг спец.предложения (принимает либо 0 либо 1),
flagnews флаг новинки (принимает либо 0 либо 1),
эти значения выводятся рендомом на главной странице сайта,
т.е сканируется вся база и выбираются значения товаров, для
которых значение flagspec = 1
SELECT * FROM itproduct WHERE flagspec = 1 ORDER BY RAND()
-------------------------------------------------------------
img - путь к картинке товара,
other - динамическое описание товара,
id_group - параметр, определяющий принадлежность товара к определённой группе,
position - путь к файлу товара,
Список медленных SQL - запросов:
(используются именно в таких сочетаниях, т.е. нет дополнительных условий и сложностей)
SELECT * FROM itproduct WHERE articul = 108765 (и т.п.);
SELECT * FROM itproduct WHERE id_group = 7489 (и т.п.);
SELECT * FROM itproduct WHERE flagnews = 1 ORDER BY RAND();
SELECT * FROM itproduct WHERE flagspec = 1 ORDER BY RAND();
Какие поля стоит установить как индексы?
Я писал так:
ALTER TABLE itproduct ADD INDEX ('articul');
ALTER TABLE itproduct ADD INDEX ('id_group');
ALTER TABLE itproduct ADD INDEX ('flagnews');
ALTER TABLE itproduct ADD INDEX ('flagspec');
Правильно ли это? При этом всё равно, правда реже, но возникали медленные запросы
Значения полей articul и id_group - имеют разные числовые типы! Стоит ли их привести к одному и как-то объединить в индексы?
Стоит ли объединить индексы (правильно ли это)?
ALTER TABLE itproduct ADD INDEX ('articul', 'id_group');
Вообще индексы вызывают у меня проблемы, пожалуйста, если это возможно на примере моей структуры укажите как было бы оптимальнее, добавить индексы к уже существующей таблице.
Я очень надеюсь на Вашу помощь.
Заранее большое Вам спасибо | |