powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить запрос (LIKE %% -> Sending data)
22 сообщений из 22, страница 1 из 1
Как ускорить запрос (LIKE %% -> Sending data)
    #38729413
Роман2343
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Пожалуйста, помогите советом:
какие условия необходимы для быстрого выполнения запроса
SELECT * FROM `table` WHERE ` phrase` LIKE '%word%’ LIMIT 0,30;
в таблице с 200 млн. строк.
В какую сторону копать в первую очередь и т.д.

Сейчас время выполнения запроса 250 сек. Основное состояние Sending data.

Таблица:
`table` (
`id` int(9) unsigned NOT NULL AUTO_INCREMENT,
`phrase` text NOT NULL,
`flag1` mediumint(5) unsigned NOT NULL,
`flag2` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY ` flag1` (`flag1`,`id`)
KEY ` flag2` (`flag2,`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;

По поводу двух последних индексов – вообще-то условие запроса подразумевались сложнее, но сначала нужно с простым запросом разобраться.

Пример данных:
| id | phrase | flag1 | flag2 |
| 12345 | фраза из нескольких слов | 123 | 1 |

Железо: 6 ядер, 8Гб RAM, диски SSD.
90% ресурсов можно отдать MySQL.

Буду благодарен любому совету.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38729434
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить.
Варианты:
1) Отказываться от LIKE '%word%’ вообще.
2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места.
3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38729675
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман2343,

А подзапросом не пробовал?

SELECT cc.* FROM
(SELECT c.ID FROM classes c WHERE c.`DESCRIPTION` LIKE '%береза%' LIMIT 0,30) AS DS
JOIN classes cc on cc.ID=DS.ID
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38729678
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barry,

а какая нахрен разница, так и так всю таблицу вычитывать
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38729853
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftПроверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить.
Варианты:
1) Отказываться от LIKE '%word%’ вообще.
2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места.
3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый.

так а есть же полнотекстовый поиск в MySQL.
Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38729861
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман2343
По поводу двух последних индексов – вообще-то условие запроса подразумевались сложнее, но сначала нужно с простым запросом разобраться.

Ты зря полагаешь, что запросы как-то ранжируются по сложности исходя из текста запроса.

В смысле -- разборки с одним запросом могут быть совсем безполезны для оптимизации другого.
Каждый запрос оптимизируется отдельно.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730167
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,
Ну вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная. Тем более на практике там может быть и связка из JOINов.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730184
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryНу вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная.В данном случае разница всего 4 байта на запись.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730188
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivтак а есть же полнотекстовый поиск в MySQL.
Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.А он работает с произвольными подстроками? Или только со словами?
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730204
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryНу вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная.а теперь внимательно смотрим на условие отбора
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730268
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglir,
Я смотрел внимательно, мы же разбираем "детский" пример, насколько я понимаю. На практике там вполне может оказаться и более полновесная таблица и связка JOINов.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38730277
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... А в таком случае - да, LIKE он и в Африке LIKE...
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38731082
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryНа практике там вполне может оказаться и более полновесная таблица и связка JOINов.и каким образом это изменит ситуацию? всё равно придётся вычитывать всю таблицу "с"
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38731098
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirвсё равно придётся вычитывать всю таблицу "с"Я согласен что на LIKE это никак не повлияет.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38731581
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftMasterZivтак а есть же полнотекстовый поиск в MySQL.
Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.А он работает с произвольными подстроками? Или только со словами?

Не очень помню/знаю, но со словами он точно должен работать.
Возможно, можно заставить его работать и с произвольными подстроками.
Работает и в InnoDB с 5.5.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38732904
Роман2343
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftПроверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить.
Варианты:
1) Отказываться от LIKE '%word%’ вообще.
2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места.
3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый.

Добрый день.
Извиняюсь, что не сразу отреагировал благодарностью за совет – доковыривал MySQL и ходил изучать Sphinx. Вероятно, что при таком объеме данных для текстового поиска нужно стороннее решение ака Sphinx.
Но со Sphinxом тоже не все гладко – т.к. исходные данные часто меняются и нужно оперативно реагировать на изменения, то подходит только Real Time индексирование, а оно почему-то не смотря на совершенно конкретный rt_mem_limit, прилично выедает оперативной памяти. К примеру, на обслуживание 200 млн. строк базы, требуется 8 Мб, что в общем достаточно дорого.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38732966
Роман2343
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivтак а есть же полнотекстовый поиск в MySQL.
Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.
т.е. уходить в MyISAM? или в InnoDB тоже можно? и как подобный запрос будет выглядеть?
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38733298
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Роман2343Извиняюсь, что не сразу отреагировал благодарностью за совет – доковыривал MySQL и ходил изучать Sphinx. Вероятно, что при таком объеме данных для текстового поиска нужно стороннее решение ака Sphinx.
.

вовсе не обязательно.

Роман2343Но со Sphinxом тоже не все гладко – т.к. исходные данные часто меняются и нужно оперативно реагировать на изменения, то подходит только Real Time индексирование, а оно почему-то не смотря на совершенно конкретный rt_mem_limit, прилично выедает оперативной памяти. К примеру, на обслуживание 200 млн. строк базы, требуется 8 Мб, что в общем достаточно дорого.

Ну а что ж ты хотел-то?

В твоём случае я думаю тебе больше подойдёт встроенный Full text search.


Роман2343т.е. уходить в MyISAM? или в InnoDB тоже можно? и как подобный запрос будет выглядеть?

Уходить на MyISAM не нужно, максимум -- проUPGRADEиться до 5.6+.
С 5.6 InnoDB поддерживает Full text search.

Примеры найдёшь тут:
http://habrahabr.ru/post/40218/
http://www.mysqltutorial.org/mysql-full-text-search.aspx
http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html
http://www.mysql.ru/docs/man/Fulltext_Search.html
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38733300
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38733447
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
соглашусь, вплане того что спор не очом. 200 млн строк. это понты.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select
date(ts),
sum(result=0),
sum(result=12),
sum(result<>0 and result<>12),

sum(result=0)+
sum(result=12)+
sum(result<>0 and result<>12),count(*)
from ap_files
group by date(ts) order by date(ts)


выполняеться за 3.2 сек,

для справки
вернуло 1000 записей, в таблице 1.2млн строк сейчас

Код: sql
1.
2.
select count(*) from
ap_files where unhex(hex(path)) like '%USER%'



path - бинарное поле, без индекса 1.2 секунды

Код: sql
1.
2.
3.
4.
select * from
ap_files where unhex(hex(path)) like '%14/08/26%'

limit 0,30


полторы секунды, как вы верно догадываетесь, почти все записи в конце таблицы(последние)
почти все - :) ибо у некоторых юзеров дата на компе сбита, есть и с 1980 годом, и с 2080
даже:)

Железо: 6 ядер, 8Гб RAM, диски SSD.
90% ресурсов можно отдать MySQL.

Буду благодарен любому совету.

ну тут что скажу, 4 ядра, гб тоже 8, нащот ссд не уверен, но 90 процентов проца
точно не отдаються... это сервер, на нём 3 виртаульные крутяться, один для моих нужд.
оперативы раньше отдали мне 16 счас забрали половину для другой виртуалки, полагаю проца у меня тоже нету трети..

у меня на этой же таблице 15 секунд сложная калькуляция обрабатываеться...
с привязкой геоинформации

походу ТС гонит гдето
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38733479
Фотография barry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453соглашусь, вплане того что спор не очом. 200 млн строк. это понты.
Не стоит сравнивать дату с произвольным текстом, я так думаю... Длины совершенно разные.
...
Рейтинг: 0 / 0
Как ускорить запрос (LIKE %% -> Sending data)
    #38733575
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
barryalex564657498765453соглашусь, вплане того что спор не очом. 200 млн строк. это понты.
Не стоит сравнивать дату с произвольным текстом, я так думаю... Длины совершенно разные.

я думаю стоит внимательней читать... :)

select count(*) from
ap_files where unhex(hex(path)) like '%USER%'



path - бинарное поле, без индекса 1.2 секунды

select * from
ap_files where unhex(hex(path)) like '%14/08/26%'

limit 0,30

ещо могу написать логичные запросы к этому полю - тоесть результат будет не
нулевой
where unhex(hex(path)) like '%empty file%'
where unhex(hex(path)) like '%error during saving%'
where unhex(hex(path)) like '%a3d4-a43e-ff32%'
where unhex(hex(path)) like '%about 2 day ago%'
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как ускорить запрос (LIKE %% -> Sending data)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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