Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Оптимизация структуры базы данных. Как это сделать?
 
 автор: webwizard   (12.01.2008 в 13:30)   письмо автору
 
 

Здравствуйте.

Пожалуйста, помогите разобраться с оптимизацией базы данных. Всё дело в том, что я впервые сталкиваюсь с большими таблицами (более 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');

Вообще индексы вызывают у меня проблемы, пожалуйста, если это возможно на примере моей структуры укажите как было бы оптимальнее, добавить индексы к уже существующей таблице.

Я очень надеюсь на Вашу помощь.

Заранее большое Вам спасибо

   
 
 автор: webwizard   (12.01.2008 в 15:32)   письмо автору
 
   для: webwizard   (12.01.2008 в 13:30)
 

Ну, пожалуйста, помогите мне с этим вопросом разобраться!

   
 
 автор: MIchail1982   (12.01.2008 в 18:30)   письмо автору
 
   для: webwizard   (12.01.2008 в 13:30)
 

на articul и d_group' ставьте индексы

индексы не объеденяйте, т.к. скорость увеличится, если делать запрос по всему объеденённому ключу

SELECT * FROM itproduct WHERE flagnews = 1 ORDER BY RAND();
SELECT * FROM itproduct WHERE flagspec = 1 ORDER BY RAND();
это зачем???
лимитируйте
SELECT * FROM itproduct WHERE flagnews = 1 ORDER BY RAND() LIMIT 10;
SELECT * FROM itproduct WHERE flagspec = 1 ORDER BY RAND() LIMIT 10;

   
 
 автор: webwizard   (13.01.2008 в 07:39)   письмо автору
 
   для: MIchail1982   (12.01.2008 в 18:30)
 

Спасибо, большое MIchail1982

А индексы я правильно устанавливаю?

ALTER TABLE itproduct ADD INDEX ('articul');
ALTER TABLE itproduct ADD INDEX ('id_group');

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования