Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса / 5 сообщений из 5, страница 1 из 1
10.05.2018, 14:10
    #39642658
liker8700
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение запроса
Здравствуйте, коллеги! Есть база данных сайта объявлений. Медленно выполняется запрос поиска по всей базе с минимальным набором фильтров. Разбирая и упрощая запрос, обнаружил что наибольшее торможение происходит на основной таблице. Когда выбираются фильтры и добавляются условия, то дело обстоит достаточно благополучно. Используются остальные созданные индексы, происходит отсев строк по условию и т.д.

В таблице ad примерно 125 тыс. строк.

Можно ли каким-то образом ускорить выполнение подобного запроса?

Итак, запрос:

Код: sql
1.
2.
3.
4.
5.
6.
SELECT SQL_CALC_FOUND_ROWS ad.id_ad, ad.title, ad.description, ad.id_user, ad.update_date, 
ad.price, ad.price2, ad.id_user_type, ad.id_action_type
FROM ad ad
WHERE ad.status=1 
ORDER BY ad.raised_date DESC, ad.update_date DESC 
LIMIT 20



Время выполнения примерно 3 сек.

Структура таблицы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
--
-- Структура таблицы `ad`
--

CREATE TABLE IF NOT EXISTS `ad` (
  `id_ad` int(11) NOT NULL AUTO_INCREMENT,
  `id_category` tinyint(3) unsigned NOT NULL,
  `id_action_type` tinyint(2) unsigned NOT NULL,
  `id_user` int(7) NOT NULL,
  `id_user_phone` int(7) NOT NULL,
  `id_user_type` tinyint(1) unsigned DEFAULT NULL,
  `title` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `title_seo` varchar(256) COLLATE utf8_unicode_ci NOT NULL,
  `description` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL,
  `key_words` varchar(256) COLLATE utf8_unicode_ci DEFAULT NULL,
  `content_text` text COLLATE utf8_unicode_ci NOT NULL,
  `create_date` int(11) unsigned NOT NULL COMMENT 'Дата создания',
  `update_date` int(11) unsigned NOT NULL COMMENT 'Дата обновления',
  `raised_date` int(11) unsigned DEFAULT '0',
  `status` int(1) NOT NULL COMMENT 'Статус',
  `price` decimal(11,0) DEFAULT NULL,
  `price2` decimal(11,0) DEFAULT NULL,
  `img` varchar(25) COLLATE utf8_unicode_ci DEFAULT NULL,
  `img_count` tinyint(2) unsigned DEFAULT NULL,
  PRIMARY KEY (`id_ad`),
  UNIQUE KEY `IDX_COMPLEX` (`id_ad`,`id_category`,`id_action_type`,`status`),
  KEY `user_id` (`id_user`),
  KEY `status` (`status`),
  KEY `id_action_type` (`id_action_type`),
  KEY `id_user_phone` (`id_user_phone`),
  KEY `id_user_type` (`id_user_type`),
  KEY `CATEGORY_ACTION` (`id_category`,`id_action_type`),
  KEY `IDX-ID_CATEGORY` (`id_category`),
  KEY `update_date` (`update_date`),
  KEY `IDX_ACTION_STATUS` (`id_action_type`,`status`),
  KEY `IDX_STATUS_UPDATE_RAISED` (`status`,`raised_date`,`update_date`),
  KEY `IDX_PRICE` (`price`),
  KEY `IDX_PRICE1_PRICE2` (`price`,`price2`),
  KEY `IDX_COMPLEX_SMALL` (`id_category`,`id_action_type`,`status`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=157720 ;

--
-- Ограничения внешнего ключа сохраненных таблиц
--

--
-- Ограничения внешнего ключа таблицы `ad`
--
ALTER TABLE `ad`
  ADD CONSTRAINT `ad_fk1` FOREIGN KEY (`id_category`) REFERENCES `category` (`id_category`) ON UPDATE CASCADE,
  ADD CONSTRAINT `ad_fk2` FOREIGN KEY (`id_user`) REFERENCES `user` (`id`),
  ADD CONSTRAINT `ad_fk3` FOREIGN KEY (`id_action_type`) REFERENCES `action_type` (`id_action_type`),
  ADD CONSTRAINT `ad_fk4` FOREIGN KEY (`id_user_phone`) REFERENCES `user_phone` (`id_user_phone`),
  ADD CONSTRAINT `ad_fk5` FOREIGN KEY (`status`) REFERENCES `ad_status_list` (`status`) ON UPDATE CASCADE,
  ADD CONSTRAINT `ad_ibfk_1` FOREIGN KEY (`id_user_type`) REFERENCES `user_type` (`id_user_type`) ON UPDATE CASCADE;



План запроса во вложении.

Версия сервера: 5.5.57-MariaDB-1~wheezy.
Версия MySQL-клиента: mysqlnd 5.0.12-dev - 20150407
...
Рейтинг: 0 / 0
10.05.2018, 14:12
    #39642661
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение запроса
перейти на версию 8 сделать индекс IDX_STATUS_UPDATE_RAISED с DESC
...
Рейтинг: 0 / 0
10.05.2018, 14:35
    #39642684
liker8700
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение запроса
Попробовал свой запрос, изменив сортировку на сортировку по возрастанию. Результат примерно такой же. Где-то попадалась информация, что MYSQL может по индексу в обе стороны ходить (могу заблуждаться)
ScareCrowперейти на версию 8 сделать индекс IDX_STATUS_UPDATE_RAISED с DESC
...
Рейтинг: 0 / 0
10.05.2018, 14:55
    #39642697
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение запроса
https://dev.mysql.com/doc/refman/8.0/en/descending-indexes.html Previously, indexes could be scanned in reverse order but at a performance penalty.


Код: sql
1.
2.
3.
WHERE ad.status=1 
ORDER BY ad.raised_date DESC, ad.update_date DESC 
LIMIT 20



попробуйте исключить SQL_CALC_FOUND_ROWS
попробуйте исключать по одному полю из where и order by и смотреть скорость.
попробуйте переписать запрос на

Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from ad where id in(
SELECT id
FROM ad ad
WHERE ad.status=1 
ORDER BY ad.raised_date DESC, ad.update_date DESC 
LIMIT 20
)
...
Рейтинг: 0 / 0
11.05.2018, 00:38
    #39642965
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение запроса
ScareCrowIDX_STATUS_UPDATE_RAISEDНаверное, лучше IDX_STATUS_RAISED_UPDATE
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]