powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как работает LIKE?
39 сообщений из 39, показаны все 2 страниц
Как работает LIKE?
    #39086363
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть 10 000 000 записей
таблица
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE test.pass (
  column1 varchar(50) DEFAULT NULL,
  name varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  id int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (id),
  INDEX IDX_pass_name (name)
)
ENGINE = INNODB
AUTO_INCREMENT = 10000001
AVG_ROW_LENGTH = 46
CHARACTER SET latin1
COLLATE latin1_swedish_ci;


есть параметр
innodb_buffer_pool_size = 512M
делаю запрос по полю name Like %ggdg% limit 5
по операциям с диском видно, что вся таблица загружена в память.
и поиск идет в памяти
но после того как запрос отработал - выдал 5 записей, по нагрузке на проц(нагрузка 100%) видно, что идет обработка данных базой
и есть подозрение , что этот запрос продолжает работать пока не прощупает всю таблицу.
потом нагрузка на проц падает практически до 0.
как-то можно остановить работу запроса после выдачи данных?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086364
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
никак, это ж серверный процесс
избавляться надо от LIKE %что-то%
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086372
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovникак, это ж серверный процесс
избавляться надо от LIKE %что-то%
Like %что-то% - это данность , избавление от него не рассматривается, не обсуждается
вопрос почему работает дальше , после выдачи данных?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086380
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпосле того как запрос отработал - выдал 5 записей, по нагрузке на проц(нагрузка 100%) видно, что идет обработка данных базой
и есть подозрение , что этот запрос продолжает работать пока не прощупает всю таблицу.
Давайте начнём с конкретного текста запроса - причём не того, что отсылается серверу, а того, что на него приходит согласно логу. Может, там CALC_FOUND_ROWS затесалось...
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086381
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по настоящему работает хранимка
входной параметр строка
name like %что-то%
хранимка такая
Код: 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.
CREATE DEFINER = 'root'@'localhost'
PROCEDURE test.page1_xxx07(IN `name` varchar(255))
BEGIN
  SET @name = `name`;
  IF (LENGTH(`name`) > 0)
  THEN
    IF `name` = '±'
    THEN
      SELECT
        pass.id,
        pass.name
      FROM pass LIMIT 15;

    ELSE

      SET @sql = 'SELECT SQL_NO_CACHE SQL_SMALL_RESULT pass.id, pass.name FROM pass WHERE ';

      SET @sql = CONCAT(@sql, `name`, ' limit 5');      

      PREPARE SSql FROM @sql;
      EXECUTE SSql;
      DEALLOCATE PREPARE SSql;
    END IF;

  END IF;
END

...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086406
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эксплейн посмотрите запроса, все будет понятно.
Вы от фуллскана никуда не уходите
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086410
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяпосле того как запрос отработал - выдал 5 записей, по нагрузке на проц(нагрузка 100%) видно, что идет обработка данных базой
и есть подозрение , что этот запрос продолжает работать пока не прощупает всю таблицу.
Проверь. Перед и после EXECUTE поставь что-нить вроде SELECT NOW() и вызови процедуру с консоли. Параллельно веди регистрацию использования процессора.

вадякак-то можно остановить работу запроса после выдачи данных?
Если верить документации , выполнение обязано прерваться... но неизвестно, относится ли это к PREPARED STATEMENT.
Попробуй то же, что выше, но со статическим запросом с тем же текстом.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086414
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovВы от фуллскана никуда не уходите
Не факт. Если имеется индекс по полю, по которому идёт отбор, предикат SQL_SMALL_RESULT может привести к использованию этого индекса.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086425
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

для меня это нонсенс
а этот хинт лучше совсем убрать, он не для этого, имхо, на экперименты к сожалению сейчас нет времени
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086446
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_UstinovAkina,

для меня это нонсенс
а этот хинт лучше совсем убрать, он не для этого, имхо, на экперименты к сожалению сейчас нет времени

Akina прав, с SQL_SMALL_RESULT выполняется 36 сек, без SQL_SMALL_RESULT - 58сек.
при выполнении из dbForge выполнение прекращается после выдачи данных.
видимо jdbc подгаживает...
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086453
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяс SQL_SMALL_RESULT выполняется 36 сек, без SQL_SMALL_RESULT - 58сек.А покажите планы обоих вариантов.
Что-то странно, с докой не сходится.

Каждый из вариантов был выполнен по несколько раз и результат устойчивый?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086457
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

я не говорю о SQL_SMALL_RESULT, судя по доке (как-то так)
SQL_SMALL_RESULT - времянка в памяти
SQL_BIG_RESULT - времянка на диске
это может и работает
но покажите два эксплейна - с и без SQL_SMALL_RESULT, посмотрим на как используется индекс по name (если он есть)
для меня нонсенс, что при LIKE %% с SQL_SMALL_RESULT может использоваться индекс
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086462
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovдля меня нонсенс, что при LIKE %% с SQL_SMALL_RESULT может использоваться индексИспользовать-то он его может (для сканирования), только непонятно, как на это SQL_SMALL_RESULT умудряется влиять.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086466
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovдля меня нонсенс, что при LIKE %% с SQL_SMALL_RESULT может использоваться индекс
http://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html If you select only a few rows with LIMIT, MySQL uses indexes in some cases when normally it would prefer to do a full table scan.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086467
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявся таблица загружена в память.Сомнительно. Не знаю, сколько там реальных данных, но в пределе таблица превышает innodb_buffer_pool_size в три раза.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086469
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftнепонятно, как на это SQL_SMALL_RESULT умудряется влиять.Никак.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086475
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akinaпредикат SQL_SMALL_RESULT может привести к использованию этого индекса.вадяс SQL_SMALL_RESULT выполняется 36 сек, без SQL_SMALL_RESULT - 58сек.Akinamiksoftнепонятно, как на это SQL_SMALL_RESULT умудряется влиять.Никак.Вы меня совсем запутали.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086482
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВы меня совсем запутали.
SQL_SMALL_RESULT даёт одну оптимизацию: если для выполнения запроса требуется временная таблица, она строится в памяти, а не на диске.
LIMIT даёт две оптимизации: первая может (но не обязана) для сканирования использовать индекс, а не таблицу, вторая должна прервать выполнение запроса по получении затребованного количества записей в выходной поток.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086488
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinamiksoftВы меня совсем запутали.
SQL_SMALL_RESULT даёт одну оптимизацию: если для выполнения запроса требуется временная таблица, она строится в памяти, а не на диске.
LIMIT даёт две оптимизации: первая может (но не обязана) для сканирования использовать индекс, а не таблицу, вторая должна прервать выполнение запроса по получении затребованного количества записей в выходной поток.Тогда постулат "предикат SQL_SMALL_RESULT может привести к использованию этого индекса." придется признать неверным. Хотя тут уже пришел вадя и добавил путаницы :)
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086491
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	pass	index	null	IDX_pass_name	153	null	9686186	Using where; Using index

они одинаковы
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086495
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя
Код: plaintext
1.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	pass	index	null	IDX_pass_name	153	null	9686186	Using where; Using index
они одинаковыТогда, скорее всего, у вас огрехи в измерении. Каждый из вариантов нужно выполнять по несколько раз и смотреть, как меняется время.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086501
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Они и должны быть одинаковы. ЕМНИП EXPLAIN при работе НЕ учитывает наличия LIMIT и потенциальных связанных с ним оптимизаций при реальном выполнении запроса.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086509
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

это все нонсенс, вот мой пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE test.exindex (
  id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  p1 char(2) DEFAULT NULL,
  p2 char(4) DEFAULT NULL,
  PRIMARY KEY (id),
  INDEX IDX_exindex_p1 (p1),
  INDEX IDX_exindex_p1p2 (p1, p2)
)
ENGINE = INNODB
AUTO_INCREMENT = 3146717
AVG_ROW_LENGTH = 34
CHARACTER SET utf8
COLLATE utf8_general_ci;

/* в поле p1 и p2 двух- и четырех-значные "числа", таблица была сгенерирована  подо что-то */
EXPLAIN SELECT SQL_NO_CACHE * FROM exindex e WHERE e.p2 LIKE "%55%"
1	SIMPLE	e	index	(null)	IDX_exindex_p1p2	20	(null)	2799595	Using where; Using index
EXPLAIN SELECT SQL_NO_CACHE * FROM exindex e WHERE e.p1 LIKE "%5"
1	SIMPLE	e	index	(null)	IDX_exindex_p1p2	20	(null)	2799595	Using where; Using index

т.е. оптимизатор решил
1. что и для p1 лучше пройтись по индексу p1p2 а не p1
2. это все без LIMIT
но это все какой-то частный необъяснимый случай... я не могу утверждать что это норма
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086524
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
буду путать дальше :)
если запускать простой селект с SQL_SMALL_RESULT может выполняться и 1 мин и 38 сек. ~ 50/50

если запускаю в хранимке с SQL_SMALL_RESULT
то работает через раз - 1 минута - 38 секунд - 1 минута - 38 секунд
(+- 3 сек)
запускал 6 раз...
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086534
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

не умеет MySQL использовать индекс не с начала строки.
Он вам только показал
possible_keys-IDX_pass_name, но реально он его не использует. Избавляйтесь от LIIKE %% )))
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086537
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov,

В версии MySQL 4.0 производится другая оптимизация на выражении LIKE. Если используется выражение ... LIKE "%string%" и длина строки (string) больше, чем 3 символа, то MySQL будет применять алгоритм Турбо Бойера-Мура для инициализации шаблона для строки и затем использовать этот шаблон, чтобы выполнить поиск быстрее.
MySQL 4.0 - видимо мануал древний...
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086539
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

Есть возможность хотя бы на время резко (раз в 5-10) увеличить innodb_buffer_pool_size ?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086541
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovне умеет MySQL использовать индекс не с начала строки.Для сканирования - почему бы и нет?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086552
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovвадя,

не умеет MySQL использовать индекс не с начала строки.
Он вам только показал
possible_keys-IDX_pass_name, но реально он его не использует. Избавляйтесь от LIIKE %% )))
в данном случае 10лимонов это тестовые, чтоб почувствовать разницу четче, в реальном применении для этого метода записей не будет больше лимона . и время уже нормальное будет.
и я почувствовал влияние innodb_buffer_pool_size = 512M. очень заметно.
меня испугало продолжение работы mysql после выдачи результата, но оказалось, что сам mysql здесь не причём. это и радует и огорчает....
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086557
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

вадя,

ну вот давайте попробуем удалить этот индекс и проверить время выполнения если возможно. Сразу будет видно, USE или не USE
Попробуем повесить запрос?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086558
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftвадя,

Есть возможность хотя бы на время резко (раз в 5-10) увеличить innodb_buffer_pool_size ?
могу поднять до 1- 5гига, вечером
попробую :)
сервер крутится на виртуалке
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086592
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovmiksoft,

вадя,

ну вот давайте попробуем удалить этот индекс и проверить время выполнения если возможно. Сразу будет видно, USE или не USE
Попробуем повесить запрос?
повесить запрос не удалось :) время осталось одинаковым 1мин или 36секунд
возросло потребление памяти
до запуск mysql занято 870М, после запуска - 970М

запускаю запрос с индексом потребление памяти поднимается до 1.2Г и стабильно держится.
без индекса потребление растёт до 1,4Г и держится...
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086615
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну вот теперь можно и думы думать. Индекс то все-таки не используется для ускорения, просто для скана, а насчет памяти - похоже не только индекс грузит а вся таблица, предположить больше ничего не могу.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086619
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

а сколько выполняется LIKE "что-то%", чтобы было видно к чему стремиться?
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086633
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinovвадя,

а сколько выполняется LIKE "что-то%", чтобы было видно к чему стремиться?
не поверишь, стремиться бессмысленно...... выполняется мнгновено :)
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39086665
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,

вот и рез-т нормального применения индекса, так что либо уйти от LIKE %%, либо если нужны форейжны этой таблицы - создавать параллельную на MyIsam с этим полем для полнотекстового индекса, как то так.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39087366
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftвадя,

Есть возможность хотя бы на время резко (раз в 5-10) увеличить innodb_buffer_pool_size ?
добавил innodb_buffer_pool_size до 1512М
показатель занятости памяти остался на 1,2Г
т.е. данные и так помещались в памяти.
на быстродействие не сказалось
мнение
innodb_buffer_pool_size надо ставить на самый максимум, пока система позволяет
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39087931
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmiksoftвадя,

Есть возможность хотя бы на время резко (раз в 5-10) увеличить innodb_buffer_pool_size ?
добавил innodb_buffer_pool_size до 1512М
показатель занятости памяти остался на 1,2Г
т.е. данные и так помещались в памяти.
на быстродействие не сказалось
мнение
innodb_buffer_pool_size надо ставить на самый максимум, пока система позволяет

Это всё ок, но ещё раз, без ухода от LIKE '%xxx%' ты от сканирования всей таблицы не уйдёшь.

Переходи на полнотекстовый индекс.
...
Рейтинг: 0 / 0
Как работает LIKE?
    #39088012
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто всё ок, но ещё раз, без ухода от LIKE '%xxx%' ты от сканирования всей таблицы не уйдёшь.

Переходи на полнотекстовый индекс.

тут уже было сравнение возможностей like и fulltext
в общем одно другим не замещается.
like намного более гибкий для поиска, но , к сожалению, только для данных определённого размера.
1-2 миллиона , что вполне для определённого круга задач
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как работает LIKE?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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