powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса
5 сообщений из 5, страница 1 из 1
Ускорение запроса
    #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
Ускорение запроса
    #39642661
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
перейти на версию 8 сделать индекс IDX_STATUS_UPDATE_RAISED с DESC
...
Рейтинг: 0 / 0
Ускорение запроса
    #39642684
liker8700
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал свой запрос, изменив сортировку на сортировку по возрастанию. Результат примерно такой же. Где-то попадалась информация, что MYSQL может по индексу в обе стороны ходить (могу заблуждаться)
ScareCrowперейти на версию 8 сделать индекс IDX_STATUS_UPDATE_RAISED с DESC
...
Рейтинг: 0 / 0
Ускорение запроса
    #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
Ускорение запроса
    #39642965
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrowIDX_STATUS_UPDATE_RAISEDНаверное, лучше IDX_STATUS_RAISED_UPDATE
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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