powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER
31 сообщений из 31, показаны все 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
Медленный запрос с LIKE и ORDER
    #39072466
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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



Благодарю!
В итоге получился такой запрос:
Код: 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.
SELECT 
	r.id AS region_id, 
	r.title AS region_title, 
	c.id AS city_id, 
	c.title AS city_title 
FROM 
	cities c, 
	(
		SELECT 
			id 
		FROM 
			cities USE INDEX(search_index) 
		WHERE 
			country_id = 212 
			AND (
				title LIKE 'g%' 
				OR title LIKE 'г%' 
				OR title LIKE 'g%'
			) 
		ORDER BY 
			id ASC 
		LIMIT 
			5
	) t, 
	regions r, 
	countries co 
WHERE 
	c.id = t.id 
	AND r.id = c.region_id 
	AND co.id = c.country_id 
	AND co.country_code = 'ru' 
GROUP BY 
	c.id
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072480
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tweaker7,

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

А GROUP BY зачем?

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

А GROUP BY зачем?Первый селекст может выбрать по йади несколько вариантов перевода города: Moscow и МоскваА у них будет одинаковый id?
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39072488
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksofttweaker7пропущено...
Первый селекст может выбрать по йади несколько вариантов перевода города: Moscow и МоскваА у них будет одинаковый id?
Верно, так как город один и тот же.
...
Рейтинг: 0 / 0
Медленный запрос с LIKE и ORDER
    #39074993
tweaker7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как можно суда JEFT JOIN вставить ?

Код: 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.
SELECT 
	r.id AS region_id, 
	r.title AS region_title, 
	c.id AS city_id, 
	c.title AS city_title 
FROM 
	cities c, 
	(
		SELECT 
			id 
		FROM 
			cities USE INDEX(search_index) 
		WHERE 
			country_id = 212 
			AND (
				title LIKE 'g%' 
				OR title LIKE 'г%' 
				OR title LIKE 'g%'
			) 
		ORDER BY 
			id ASC 
		LIMIT 
			5
	) t, 
	regions r, 
	countries co
--->LEFT JOIN regions r ON r.id = c.region_id<----
WHERE 
	c.id = t.id 
	AND r.id = c.region_id 
	AND co.id = c.country_id 
	AND co.country_code = 'ru' 
GROUP BY 
	c.id



Появилась такая ситуация что поле region_id может быть NULL и из-за этого данный населенный пункт может быть пропущен
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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