|
|
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пожалуйста, помогите советом: какие условия необходимы для быстрого выполнения запроса 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. Буду благодарен любому совету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 18:54:06 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
Проверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить. Варианты: 1) Отказываться от LIKE '%word%’ вообще. 2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места. 3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.08.2014, 19:27:39 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
Роман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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 03:31:14 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
barry, а какая нахрен разница, так и так всю таблицу вычитывать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 04:53:35 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
miksoftПроверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить. Варианты: 1) Отказываться от LIKE '%word%’ вообще. 2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места. 3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый. так а есть же полнотекстовый поиск в MySQL. Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 10:43:04 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
Роман2343 По поводу двух последних индексов – вообще-то условие запроса подразумевались сложнее, но сначала нужно с простым запросом разобраться. Ты зря полагаешь, что запросы как-то ранжируются по сложности исходя из текста запроса. В смысле -- разборки с одним запросом могут быть совсем безполезны для оптимизации другого. Каждый запрос оптимизируется отдельно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 10:46:38 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
tanglir, Ну вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная. Тем более на практике там может быть и связка из JOINов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:24:26 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
barryНу вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная.В данном случае разница всего 4 байта на запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:27:39 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
MasterZivтак а есть же полнотекстовый поиск в MySQL. Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.А он работает с произвольными подстроками? Или только со словами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:28:28 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
barryНу вычитывать один id или вычитывать всю запись с текстами - разница есть и обычно существенная.а теперь внимательно смотрим на условие отбора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:34:22 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
tanglir, Я смотрел внимательно, мы же разбираем "детский" пример, насколько я понимаю. На практике там вполне может оказаться и более полновесная таблица и связка JOINов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:56:05 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
... А в таком случае - да, LIKE он и в Африке LIKE... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.08.2014, 13:59:31 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
barryНа практике там вполне может оказаться и более полновесная таблица и связка JOINов.и каким образом это изменит ситуацию? всё равно придётся вычитывать всю таблицу "с" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 05:34:50 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
tanglirвсё равно придётся вычитывать всю таблицу "с"Я согласен что на LIKE это никак не повлияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 07:02:26 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
miksoftMasterZivтак а есть же полнотекстовый поиск в MySQL. Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска.А он работает с произвольными подстроками? Или только со словами? Не очень помню/знаю, но со словами он точно должен работать. Возможно, можно заставить его работать и с произвольными подстроками. Работает и в InnoDB с 5.5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.08.2014, 13:45:54 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
miksoftПроверка почти миллиона записей в секунду - это достаточно быстро, тут вряд ли можно что-то серьезно ускорить. Варианты: 1) Отказываться от LIKE '%word%’ вообще. 2) Строить свой мега-индекс с фрагментами строк. Тут возможны варианты, но в любом случае понадобится много дискового места. 3) Использовать внешний индексаторы, например, Sphinx. Это фактически пункт 2, только оптимизированный и более развитый. Добрый день. Извиняюсь, что не сразу отреагировал благодарностью за совет – доковыривал MySQL и ходил изучать Sphinx. Вероятно, что при таком объеме данных для текстового поиска нужно стороннее решение ака Sphinx. Но со Sphinxом тоже не все гладко – т.к. исходные данные часто меняются и нужно оперативно реагировать на изменения, то подходит только Real Time индексирование, а оно почему-то не смотря на совершенно конкретный rt_mem_limit, прилично выедает оперативной памяти. К примеру, на обслуживание 200 млн. строк базы, требуется 8 Мб, что в общем достаточно дорого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2014, 16:14:52 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
MasterZivтак а есть же полнотекстовый поиск в MySQL. Его и надо задействовать, Like естественно нужно переписать на выражение полнотекстового поиска. т.е. уходить в MyISAM? или в InnoDB тоже можно? и как подобный запрос будет выглядеть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.08.2014, 17:00:22 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
Роман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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2014, 12:34:59 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2014, 12:35:49 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
соглашусь, вплане того что спор не очом. 200 млн строк. это понты. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. выполняеться за 3.2 сек, для справки вернуло 1000 записей, в таблице 1.2млн строк сейчас Код: sql 1. 2. path - бинарное поле, без индекса 1.2 секунды Код: sql 1. 2. 3. 4. полторы секунды, как вы верно догадываетесь, почти все записи в конце таблицы(последние) почти все - :) ибо у некоторых юзеров дата на компе сбита, есть и с 1980 годом, и с 2080 даже:) Железо: 6 ядер, 8Гб RAM, диски SSD. 90% ресурсов можно отдать MySQL. Буду благодарен любому совету. ну тут что скажу, 4 ядра, гб тоже 8, нащот ссд не уверен, но 90 процентов проца точно не отдаються... это сервер, на нём 3 виртаульные крутяться, один для моих нужд. оперативы раньше отдали мне 16 счас забрали половину для другой виртуалки, полагаю проца у меня тоже нету трети.. у меня на этой же таблице 15 секунд сложная калькуляция обрабатываеться... с привязкой геоинформации походу ТС гонит гдето ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2014, 21:16:51 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
alex564657498765453соглашусь, вплане того что спор не очом. 200 млн строк. это понты. Не стоит сравнивать дату с произвольным текстом, я так думаю... Длины совершенно разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.08.2014, 23:20:07 |
|
||
|
Как ускорить запрос (LIKE %% -> Sending data)
|
|||
|---|---|---|---|
|
#18+
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%' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2014, 15:04:57 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=164&tid=1834300]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
178ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 507ms |

| 0 / 0 |
