powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER
25 сообщений из 31, страница 1 из 2
Медленный запрос с LIKE и ORDER
    #39071361
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется таблица с 2 000 000 записями.

Структура:
Код: 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.
--
-- Структура таблицы `cities`
--

CREATE TABLE IF NOT EXISTS `cities` (
  `id` bigint(50) unsigned NOT NULL,
  `title` varchar(250) CHARACTER SET utf8mb4 NOT NULL,
  `area` varchar(250) NOT NULL,
  `region_id` int(250) unsigned DEFAULT NULL,
  `country_code` enum('ru','en','lv','fr','de','tr','ae','ir','es','it','au','nl','be','lu','no','se','ch','ee','dk','pt','lt','gr','fi','pl','bg','cz','sk','at','si','hr','rs','ba','hu') NOT NULL,
  `country_id` int(11) DEFAULT NULL,
  `region` varchar(200) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Индексы таблицы `cities`
--
ALTER TABLE `cities`
  ADD UNIQUE KEY `id_2` (`id`,`region_id`,`country_code`),
  ADD KEY `country_code` (`country_code`),
  ADD KEY `region_id` (`region_id`),
  ADD KEY `title` (`title`),
  ADD KEY `id` (`id`),
  ADD KEY `country_id` (`country_id`);



Медленно работает данный запрос:
Код: sql
1.
SELECT SQL_NO_CACHE * FROM cities c WHERE c.country_id = 212 AND c.title LIKE 'I%' ORDER BY c.id ASC LIMIT 5



EXPLAIN:


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

Данный запрос выполняет поиск по подстроке города, с известным country_id. Так же выполняется сортировала по id.

Как то можно оптимизировать данный запрос? Или я не тот способ выбрал для данной цели? Если не тот, то что лучше использовать в этом случае?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071371
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте создать индекс (country_id,id,title), дать команду ANALYZE TABLE cities и выполнить такой запрос:
Код: sql
1.
SELECT SQL_NO_CACHE id FROM cities c WHERE c.country_id = 212 AND c.title LIKE 'I%' ORDER BY c.id ASC LIMIT 5

Покажите время выполнения (сделайте несколько запусков) и план запроса.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071384
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftПопробуйте создать индекс (country_id,id,title), дать команду ANALYZE TABLE cities и выполнить такой запрос:
Код: sql
1.
SELECT SQL_NO_CACHE id FROM cities c WHERE c.country_id = 212 AND c.title LIKE 'I%' ORDER BY c.id ASC LIMIT 5

Покажите время выполнения (сделайте несколько запусков) и план запроса.

Здравствуйте,
Запрос занял 0.5563 сек.



Через явное указание использование индекса title при помощью USE INDEX время выполнение сократилось до: 0.0216 сек.

В EXPLAIN:


Вообще это нормально так указывать USE INDEX в запросе? Ранее не работал с таким методом. И чем FORCE INDEX отличается от USE INDEX ?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071481
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7это нормально так указывать USE INDEX в запросе?
Да

tweaker7Через явное указание использование индекса title при помощью USE INDEX время выполнение сократилось
Укажите явно использовать индекс, предложенный miksoft .

tweaker7чем FORCE INDEX отличается от USE INDEX ?
FORCE INDEX аналогичен USE INDEX с дополнительным указанием оптимизатору, что сканирование таблицы ОЧЕНЬ затратно, и его следует использовать в самую последнюю очередь - только если ни один из имеющихся индексов не может обеспечить выполнение запроса.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071739
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft , Akina , спасибо вам большое!

Код: sql
1.
SELECT SQL_NO_CACHE * FROM cities c USE INDEX(search_index) WHERE c.country_id = 212 AND c.title LIKE 'I%' ORDER BY c.id ASC LIMIT 5



Время выполнения стало меньше: 0.0059 сек.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071761
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7,

Я просил выбрать только поле id с тем, чтобы потом использовать эти данные для следующего шага. Но если результат уже устраивает, то на здоровье.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071768
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7,

в твоем индексе поля местами переставь , country первым, title вторым. или другой индекс с полями наоборот создай.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071785
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofttweaker7,

Я просил выбрать только поле id с тем, чтобы потом использовать эти данные для следующего шага. Но если результат уже устраивает, то на здоровье.

Да так еще быстрее: 0.0022 сек.

MasterZivtweaker7,

в твоем индексе поля местами переставь , country первым, title вторым. или другой индекс с полями наоборот создай.

А так еще быстрее: 0.0005 сек.

Спасибо всем за помощь, результаты отличные!
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071791
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7,

А сколько выдаст этот запрос:
Код: sql
1.
SELECT count(*) FROM cities c WHERE c.country_id = 212 AND c.title LIKE 'I%'

?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071794
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

92 записи
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071800
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7miksoft,

92 записиЭто копейки. Сначала напугали двумя миллионами :)
Да, для такого случая индекс (country_id, title), наверное, будет самым быстрым вариантом.
Еще я б попробовал (country_id, title, id).
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39071809
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofttweaker7miksoft,

92 записиЭто копейки. Сначала напугали двумя миллионами :)
Да, для такого случая индекс (country_id, title), наверное, будет самым быстрым вариантом.
Еще я б попробовал (country_id, title, id).

Там действительно 2млн населенных пунктов по разным странам, и это 1/5 всех стран на данный момент. Просто в стране 212 (Хорватия) 92 нас. пункта начинаются на I. По этому так мало. К примеру в РФ там уже поболее, так как все пригородные поселки и деревни включены. Там помедленнее ищет. Но все же результатом доволен.

miksoftЕще я б попробовал (country_id, title, id).
Сейчас так и поставил.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072115
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7Да так еще быстрее: 0.0022 сек.
А так еще быстрее: 0.0005 сек.


Если ты думаешь, что время выполнения запроса -- хороший критерий измерения его производительности, то ты, как ни странно, ошибаешься.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072116
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksofttweaker7miksoft,

92 записиЭто копейки. Сначала напугали двумя миллионами :)
Да, для такого случая индекс (country_id, title), наверное, будет самым быстрым вариантом.
Еще я б попробовал (country_id, title, id).

ORDER BY c.id ASC

там уже не оптимизируется, там ренж скан по индексу будет из-за title like 'I%' и сортировка по c.id уже потеряется.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072119
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmiksoftпропущено...
Это копейки. Сначала напугали двумя миллионами :)
Да, для такого случая индекс (country_id, title), наверное, будет самым быстрым вариантом.
Еще я б попробовал (country_id, title, id).

ORDER BY c.id ASC

там уже не оптимизируется, там ренж скан по индексу будет из-за title like 'I%' и сортировка по c.id уже потеряется.Да я на эту сортировку и не рассчитывал.
С расчетом на сортировку был другой вариант - 18250093
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072131
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftMasterZivпропущено...


ORDER BY c.id ASC

там уже не оптимизируется, там ренж скан по индексу будет из-за title like 'I%' и сортировка по c.id уже потеряется.Да я на эту сортировку и не рассчитывал.
С расчетом на сортировку был другой вариант - 18250093

А зачем тогда ещё одну колонку (ID) в индекс ?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072148
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmiksoftпропущено...
Да я на эту сортировку и не рассчитывал.
С расчетом на сортировку был другой вариант - 18250093

А зачем тогда ещё одну колонку (ID) в индекс ?Для покрытия.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072195
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftMasterZivпропущено...


А зачем тогда ещё одну колонку (ID) в индекс ?Для покрытия.

Код: sql
1.
SELECT SQL_NO_CACHE * FROM cities



??
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072197
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftMasterZivпропущено...


ORDER BY c.id ASC

там уже не оптимизируется, там ренж скан по индексу будет из-за title like 'I%' и сортировка по c.id уже потеряется.Да я на эту сортировку и не рассчитывал.
С расчетом на сортировку был другой вариант - 18250093

Собственное так и сделал, а там уже через WHERE IN по id и JOIN к country и regions
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072205
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivtweaker7Да так еще быстрее: 0.0022 сек.
А так еще быстрее: 0.0005 сек.


Если ты думаешь, что время выполнения запроса -- хороший критерий измерения его производительности, то ты, как ни странно, ошибаешься.
Это еще почему?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072220
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7WHERE INЕсли речь про IN (SELECT ...) и версия MySQL ниже 5.6, то лучше переписать на JOIN.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072226
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofttweaker7WHERE INЕсли речь про IN (SELECT ...) и версия MySQL ниже 5.6, то лучше переписать на JOIN.

Код: ruby
1.
mysql  Ver 14.14 Distrib 5.5.44, for debian-linux-gnu (x86_64) using readline 6.3



А как будет выглядеть запросе через JOIN ? Через OR ?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072229
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7
Код: ruby
1.
mysql  Ver 14.14 Distrib 5.5.44, for debian-linux-gnu (x86_64) using readline 6.3

Это версия 5.5.44
tweaker7А как будет выглядеть запросе через JOIN ? Через OR ?Нет, причем тут OR?
Покажите, как у вас написано через IN, чтобы было что переделать.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072236
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofttweaker7
Код: ruby
1.
mysql  Ver 14.14 Distrib 5.5.44, for debian-linux-gnu (x86_64) using readline 6.3

Это версия 5.5.44
tweaker7А как будет выглядеть запросе через JOIN ? Через OR ?Нет, причем тут OR?
Покажите, как у вас написано через IN, чтобы было что переделать.

Собственно запрос так не выполняется:

Код: sql
1.
2.
3.
SELECT SQL_NO_CACHE * FROM cities WHERE id IN(SELECT id FROM cities c USE INDEX(search_index) WHERE country_id = 212 AND title LIKE 'I%' ORDER BY id ASC LIMIT 5) 

#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072260
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
SELECT SQL_NO_CACHE *
FROM cities, (SELECT id FROM cities c USE INDEX(search_index) WHERE country_id = 212 AND title LIKE 'I%' ORDER BY id ASC LIMIT 5) t
WHERE cities.id=t.id
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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