Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER / 25 сообщений из 31, страница 1 из 2
07.10.2015, 23:28:44
    #39071361
tweaker7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
Имеется таблица с 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
07.10.2015, 23:48:34
    #39071371
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
Попробуйте создать индекс (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
08.10.2015, 00:17:06
    #39071384
tweaker7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
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
08.10.2015, 09:08:35
    #39071481
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
tweaker7это нормально так указывать USE INDEX в запросе?
Да

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

tweaker7чем FORCE INDEX отличается от USE INDEX ?
FORCE INDEX аналогичен USE INDEX с дополнительным указанием оптимизатору, что сканирование таблицы ОЧЕНЬ затратно, и его следует использовать в самую последнюю очередь - только если ни один из имеющихся индексов не может обеспечить выполнение запроса.
...
Рейтинг: 0 / 0
08.10.2015, 11:52:14
    #39071739
tweaker7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
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
08.10.2015, 12:00:11
    #39071761
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
tweaker7,

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

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

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

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

MasterZivtweaker7,

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

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

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

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

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

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

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

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

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

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


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

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

ORDER BY c.id ASC

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

ORDER BY c.id ASC

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


ORDER BY c.id ASC

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

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

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


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

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



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


ORDER BY c.id ASC

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

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


Если ты думаешь, что время выполнения запроса -- хороший критерий измерения его производительности, то ты, как ни странно, ошибаешься.
Это еще почему?
...
Рейтинг: 0 / 0
08.10.2015, 17:10:45
    #39072220
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
tweaker7WHERE INЕсли речь про IN (SELECT ...) и версия MySQL ниже 5.6, то лучше переписать на JOIN.
...
Рейтинг: 0 / 0
08.10.2015, 17:13:46
    #39072226
tweaker7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
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
08.10.2015, 17:16:42
    #39072229
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
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
08.10.2015, 17:21:53
    #39072236
tweaker7
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
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
08.10.2015, 17:40:41
    #39072260
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленный запрос с LIKE и ORDER
Код: 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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный запрос с LIKE и ORDER / 25 сообщений из 31, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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