SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.12.2011 19:50:17

daniel20
Участник
Зарегистрирован: 07.12.2011
Сообщений: 7

Оптимизация запросов с помощью индексов

Здравствуйте!
имею 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)

Неактивен

 

#2 12.12.2011 23:24:08

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Оптимизация запросов с помощью индексов

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

А что значит "запрос становится тяжелее"? Дольше выполняется?
Если количество элементов в таблице растёт, то и размер индекса будет расти, никуда не денешься.
И какой именно запрос, кстати? Покажите запрос и его explain.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 13.12.2011 11:30:05

daniel20
Участник
Зарегистрирован: 07.12.2011
Сообщений: 7

Re: Оптимизация запросов с помощью индексов

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

а хорошую книжку по оптимизации запросов кто нить знает? smile

Неактивен

 

#4 13.12.2011 13:37:58

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Оптимизация запросов с помощью индексов

Что-то мне подсказывает, что не в этой связке дело в Вашем запросе wink. Если выкинете из запроса все остальное и оставите только их и связку - все, думаю, будет летать - проверьте.

Конкретно по отпимизации книжку не встречал, только отрывочную информацию. И курс по оптимизации MySQL рекомендую пройти.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 13.12.2011 14:59:10

daniel20
Участник
Зарегистрирован: 07.12.2011
Сообщений: 7

Re: Оптимизация запросов с помощью индексов

deadka написал:

Что-то мне подсказывает, что не в этой связке дело в Вашем запросе wink. Если выкинете из запроса все остальное и оставите только их и связку - все, думаю, будет летать - проверьте.

Конкретно по отпимизации книжку не встречал, только отрывочную информацию. И курс по оптимизации MySQL рекомендую пройти.

Не спорю, летит, но ноль одна сек.  (0.09сек) тоже не устраивает. Думаю что оно должно быстрее работать. На счет курсов, спасибо.

Неактивен

 

#6 14.12.2011 14:29:35

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Оптимизация запросов с помощью индексов

Так скорость выполнения запросов не прямо пропорциональна количеству записей, так-что на этот счёт не волнуйтесь smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#7 14.12.2011 15:55:05

daniel20
Участник
Зарегистрирован: 07.12.2011
Сообщений: 7

Re: Оптимизация запросов с помощью индексов

Надеюсь. Будет свободное время, потестирую smile

Кстати, удалил индексы и создал заново, заработало в 2 раза быстрее, почему, не знаю.

Отредактированно daniel20 (14.12.2011 15:57:17)

Неактивен

 

#8 14.12.2011 17:49:19

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Оптимизация запросов с помощью индексов

Значит надо было просто оптимизировать таблицу, это даёт тот же результат. По причинам не в курсе, сам иногда такое наблюдаю при интенсивной работе с данными.


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson