Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как работает LIKE? / 25 сообщений из 39, страница 1 из 2
26.10.2015, 08:25:15
    #39086363
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
есть 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
26.10.2015, 08:28:21
    #39086364
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
никак, это ж серверный процесс
избавляться надо от LIKE %что-то%
...
Рейтинг: 0 / 0
26.10.2015, 08:51:17
    #39086372
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
Alex_Ustinovникак, это ж серверный процесс
избавляться надо от LIKE %что-то%
Like %что-то% - это данность , избавление от него не рассматривается, не обсуждается
вопрос почему работает дальше , после выдачи данных?
...
Рейтинг: 0 / 0
26.10.2015, 09:08:56
    #39086380
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
вадяпосле того как запрос отработал - выдал 5 записей, по нагрузке на проц(нагрузка 100%) видно, что идет обработка данных базой
и есть подозрение , что этот запрос продолжает работать пока не прощупает всю таблицу.
Давайте начнём с конкретного текста запроса - причём не того, что отсылается серверу, а того, что на него приходит согласно логу. Может, там CALC_FOUND_ROWS затесалось...
...
Рейтинг: 0 / 0
26.10.2015, 09:15:47
    #39086381
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
по настоящему работает хранимка
входной параметр строка
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
26.10.2015, 09:42:25
    #39086406
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
эксплейн посмотрите запроса, все будет понятно.
Вы от фуллскана никуда не уходите
...
Рейтинг: 0 / 0
26.10.2015, 09:46:40
    #39086410
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
вадяпосле того как запрос отработал - выдал 5 записей, по нагрузке на проц(нагрузка 100%) видно, что идет обработка данных базой
и есть подозрение , что этот запрос продолжает работать пока не прощупает всю таблицу.
Проверь. Перед и после EXECUTE поставь что-нить вроде SELECT NOW() и вызови процедуру с консоли. Параллельно веди регистрацию использования процессора.

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

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

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

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

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

я не говорю о SQL_SMALL_RESULT, судя по доке (как-то так)
SQL_SMALL_RESULT - времянка в памяти
SQL_BIG_RESULT - времянка на диске
это может и работает
но покажите два эксплейна - с и без SQL_SMALL_RESULT, посмотрим на как используется индекс по name (если он есть)
для меня нонсенс, что при LIKE %% с SQL_SMALL_RESULT может использоваться индекс
...
Рейтинг: 0 / 0
26.10.2015, 10:18:40
    #39086462
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
Alex_Ustinovдля меня нонсенс, что при LIKE %% с SQL_SMALL_RESULT может использоваться индексИспользовать-то он его может (для сканирования), только непонятно, как на это SQL_SMALL_RESULT умудряется влиять.
...
Рейтинг: 0 / 0
26.10.2015, 10:20:37
    #39086466
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
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
26.10.2015, 10:20:43
    #39086467
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
вадявся таблица загружена в память.Сомнительно. Не знаю, сколько там реальных данных, но в пределе таблица превышает innodb_buffer_pool_size в три раза.
...
Рейтинг: 0 / 0
26.10.2015, 10:20:59
    #39086469
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
miksoftнепонятно, как на это SQL_SMALL_RESULT умудряется влиять.Никак.
...
Рейтинг: 0 / 0
26.10.2015, 10:31:12
    #39086475
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
Akinaпредикат SQL_SMALL_RESULT может привести к использованию этого индекса.вадяс SQL_SMALL_RESULT выполняется 36 сек, без SQL_SMALL_RESULT - 58сек.Akinamiksoftнепонятно, как на это SQL_SMALL_RESULT умудряется влиять.Никак.Вы меня совсем запутали.
...
Рейтинг: 0 / 0
26.10.2015, 10:35:28
    #39086482
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
miksoftВы меня совсем запутали.
SQL_SMALL_RESULT даёт одну оптимизацию: если для выполнения запроса требуется временная таблица, она строится в памяти, а не на диске.
LIMIT даёт две оптимизации: первая может (но не обязана) для сканирования использовать индекс, а не таблицу, вторая должна прервать выполнение запроса по получении затребованного количества записей в выходной поток.
...
Рейтинг: 0 / 0
26.10.2015, 10:38:24
    #39086488
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
AkinamiksoftВы меня совсем запутали.
SQL_SMALL_RESULT даёт одну оптимизацию: если для выполнения запроса требуется временная таблица, она строится в памяти, а не на диске.
LIMIT даёт две оптимизации: первая может (но не обязана) для сканирования использовать индекс, а не таблицу, вторая должна прервать выполнение запроса по получении затребованного количества записей в выходной поток.Тогда постулат "предикат SQL_SMALL_RESULT может привести к использованию этого индекса." придется признать неверным. Хотя тут уже пришел вадя и добавил путаницы :)
...
Рейтинг: 0 / 0
26.10.2015, 10:39:35
    #39086491
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
Код: 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
26.10.2015, 10:41:47
    #39086495
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
вадя
Код: 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
26.10.2015, 10:48:58
    #39086501
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
Они и должны быть одинаковы. ЕМНИП EXPLAIN при работе НЕ учитывает наличия LIMIT и потенциальных связанных с ним оптимизаций при реальном выполнении запроса.
...
Рейтинг: 0 / 0
26.10.2015, 10:54:16
    #39086509
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
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
26.10.2015, 11:04:53
    #39086524
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как работает LIKE?
буду путать дальше :)
если запускать простой селект с SQL_SMALL_RESULT может выполняться и 1 мин и 38 сек. ~ 50/50

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

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


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