Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
имею 2 таблицы:
CREATE TABLE items( items_id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(255) DEFAULT NULL, when_added TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, items_manufacturers_id VARCHAR(255) DEFAULT NULL, items_images_id INT(11) UNSIGNED DEFAULT NULL, classifier_id INT(11) DEFAULT NULL, PRIMARY KEY (items_id), INDEX IX_items_classifier_id (classifier_id) ) ENGINE = INNODB AUTO_INCREMENT = 104035 AVG_ROW_LENGTH = 68 CHARACTER SET utf8 COLLATE utf8_general_ci;
как видно, индексирована колонка items_id (уникальный ключь)
и вторая таблица:
CREATE TABLE items_prices( items_prices_id INT(11) NOT NULL AUTO_INCREMENT, online_stores_items_id INT(11) DEFAULT NULL, new_price DECIMAL(10, 2) DEFAULT NULL, available SMALLINT(1) UNSIGNED DEFAULT NULL, when_added TIMESTAMP DEFAULT CURRENT_TIMESTAMP, old_price VARCHAR(100) DEFAULT NULL, description TEXT DEFAULT NULL, contact_phones TINYTEXT DEFAULT NULL, currency TINYINT(4) DEFAULT 1 is_current_price BIT(1) DEFAULT b'1', items_id INT(11) DEFAULT NULL, PRIMARY KEY (items_prices_id), INDEX IX_items_prices (items_id) ) ENGINE = INNODB AUTO_INCREMENT = 66076 AVG_ROW_LENGTH = 61 CHARACTER SET utf8 COLLATE utf8_general_ci;
как видно, индексирована колонка items_id (не уникальный ключь)
в общем вот какая проблема: при простой связки этих таблиц по items_id запрос становится тяжелее и за ежедневного роста не уникальных индексов items_id таблицы items_prices. Как можно этого избежать?
!!! Проблема именно в не уникальных индексов потому что с другими таблицами связка идет на ура.
Отредактированно daniel20 (12.12.2011 19:51:28)
Неактивен
Здравствуйте.
А что значит "запрос становится тяжелее"? Дольше выполняется?
Если количество элементов в таблице растёт, то и размер индекса будет расти, никуда не денешься.
И какой именно запрос, кстати? Покажите запрос и его explain.
Неактивен
deadka написал:
Здравствуйте.
А что значит "запрос становится тяжелее"? Дольше выполняется?
Если количество элементов в таблице растёт, то и размер индекса будет расти, никуда не денешься.
И какой именно запрос, кстати? Покажите запрос и его explain.
Да, дольше выполняется.
А запрос включяет больше таблиц, но грузится именно и за этой связки. (его выполнение 0.3 сек., всего лишь при 50000 записей, думаю в дальнейшем расти на пару миллионов)
суть этого запроса вывести самые низкие цены, потом есть еще блок вывода самых дорогих товаров там еще +0.3сек.
SELECT `osi`.`items_id`
, `osi`.`online_stores_items_id`
, `ip`.`new_price`
FROM
`online_stores_items` AS `osi`
INNER JOIN `items` AS `i`
ON i.items_id = osi.items_id AND osi.items_id > 0
INNER JOIN `items_prices` AS `ip`
ON ip.online_stores_items_id = osi.online_stores_items_id AND is_current_price = 1
INNER JOIN `classifier` AS `c`
ON c.classifier_id = i.classifier_id
WHERE
(new_price > 0
AND (time_to_sec(timediff(osi.life_time, now())) >= 0
OR time_to_sec(timediff(osi.life_time, now())) IS NULL))
GROUP BY
`osi`.`items_id`
ORDER BY
`ip`.`new_price` ASC
LIMIT
4
а хорошую книжку по оптимизации запросов кто нить знает?
Неактивен
Что-то мне подсказывает, что не в этой связке дело в Вашем запросе . Если выкинете из запроса все остальное и оставите только их и связку - все, думаю, будет летать - проверьте.
Конкретно по отпимизации книжку не встречал, только отрывочную информацию. И курс по оптимизации MySQL рекомендую пройти.
Неактивен
deadka написал:
Что-то мне подсказывает, что не в этой связке дело в Вашем запросе . Если выкинете из запроса все остальное и оставите только их и связку - все, думаю, будет летать - проверьте.
Конкретно по отпимизации книжку не встречал, только отрывочную информацию. И курс по оптимизации MySQL рекомендую пройти.
Не спорю, летит, но ноль одна сек. (0.09сек) тоже не устраивает. Думаю что оно должно быстрее работать. На счет курсов, спасибо.
Неактивен
Так скорость выполнения запросов не прямо пропорциональна количеству записей, так-что на этот счёт не волнуйтесь
Неактивен
Надеюсь. Будет свободное время, потестирую
Кстати, удалил индексы и создал заново, заработало в 2 раза быстрее, почему, не знаю.
Отредактированно daniel20 (14.12.2011 15:57:17)
Неактивен
Значит надо было просто оптимизировать таблицу, это даёт тот же результат. По причинам не в курсе, сам иногда такое наблюдаю при интенсивной работе с данными.
Неактивен