powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как оптимизировать выбор с like и AND
25 сообщений из 46, страница 1 из 2
Как оптимизировать выбор с like и AND
    #39700658
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть запрос
Код: sql
1.
select * from tbl where zz like '%55%' limit 5;


выполняется за 0.05 сек
делаю так

Код: sql
1.
select * from tbl where zz like '%55%' and zz like '%66%' limit 5;


выполняется уже за 2сек

почему такое различие?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700662
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что второе условие требует кэширования на диск.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700666
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПотому что второе условие требует кэширования на диск.как это исключить?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700668
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
SELECT *
FROM ( SELECT *
       FROM tbl
       WHERE zz like '%pattern1%'
     ) xx
WHERE zz like '%pattern2%'


Причём желательно внутрь запихать наиболее селективный шаблон.
На версии 8+ можно использовать CTE.

Но ничего не поможет, если даже на наиболее селективном шаблоне промежуточная выборка "пухлая".
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700671
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНа версии 8+ можно использовать CTE.это что ? дай ссылку
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700672
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaПотому что второе условие требует кэширования на диск.а почему? а если добавить памяти для кеша?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700676
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесть запрос
Код: sql
1.
select * from tbl where zz like '%55%' limit 5;



выполняется за 0.05 сек
делаю так

Код: sql
1.
select * from tbl where zz like '%55%' and zz like '%66%' limit 5;



выполняется уже за 2сек

почему такое различие?Утрируя, у вас %55% в каждой второй записи, поэтому достаточно прочитать первый десяток и готово. А %66% в одной записи на миллион, поэтому приходится читать с диска 5 миллионов записей. Чувствуете разницу?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700702
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftУтрируя, у вас %55% в каждой второй записи, поэтому достаточно прочитать первый десяток и готово. А %66% в одной записи на миллион, поэтому приходится читать с диска 5 миллионов записей. Чувствуете разницу?у меня 3м записей и 10+гиг для кэша, т.е. всё в кэше. и один like срабатывает только по памяти. если сделать кэш 20гиг?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700704
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесть запрос
Код: sql
1.
select * from tbl where zz like '%55%' limit 5;


выполняется за 0.05 сек
делаю так

Код: sql
1.
select * from tbl where zz like '%55%' and zz like '%66%' limit 5;


выполняется уже за 2сек

почему такое различие?

Потому что это разные запросы, они выполняться за разгон время будут.


Like надо писать только с % в конце, и только достаточно длинные паттерны
Иначе это не оптимизирует ся
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700705
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяесть запрос
Код: sql
1.
select * from tbl where zz like '%55%' limit 5;


выполняется за 0.05 сек
делаю так

Код: sql
1.
select * from tbl where zz like '%55%' and zz like '%66%' limit 5;


выполняется уже за 2сек

почему такое различие?

А ну да, парень, если ты время мерить хочешь, limit убирай всегда
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700709
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяэто что ? дай ссылку
WITH Syntax (Common Table Expressions)

вадяа если добавить памяти для кеша?Память не поможет. Всё равно кэшируется НА ДИСК. Вот перенос базового каталога на SSD - это поможет.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700713
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяmiksoftУтрируя, у вас %55% в каждой второй записи, поэтому достаточно прочитать первый десяток и готово. А %66% в одной записи на миллион, поэтому приходится читать с диска 5 миллионов записей. Чувствуете разницу?у меня 3м записей и 10+гиг для кэша, т.е. всё в кэше. и один like срабатывает только по памяти. если сделать кэш 20гиг?Так селективность условий какая? Даже если не надо все это поднимать с диска, то для CPU работа остается в полном объеме.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700714
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaВсё равно кэшируется НА ДИСК.Почему? тут же нет ни сортировки, ни группировки.
AkinaВот перенос базового каталога на SSD - это поможет.Тогда уж в RAM, если ее полно.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700715
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя10+гиг для кэшаА MySQL об этом знает? Настройки заданы и тип таблицы позволяет?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700716
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА ну да, парень, если ты время мерить хочешь, limit убирай всегдадля абсолютного сравнения - согласен.

Akina,
твой совет не помог
12
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  *
FROM (SELECT
    xxx.ID,
    xxx.UPCEAN,
    xxx.Name,
    xxx.CategoryName,
    xxx.BrandName,
    xxx.zz
  FROM xxx
  WHERE xxx.zz LIKE '%зяйст%' xx
WHERE xx.zz LIKE '%65%'

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  xxx.ID,
  xxx.UPCEAN,
  xxx.Name,
  xxx.CategoryName,
  xxx.BrandName,
  xxx.zz
FROM xxx
WHERE xxx.zz LIKE '%зяйст%'
AND xxx.zz LIKE '%65%'


время одинаковое
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700718
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftА MySQL об этом знает? Настройки заданы и тип таблицы позволяет?всё прописано в .ini
AkinaПамять не поможет. Всё равно кэшируется НА ДИСК. Вот перенос базового каталога на SSD - это поможет.обращения к диску нет.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700725
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как выполняется такое:
Код: sql
1.
WHERE xxx.zz LIKE '%зяйст%' AND xxx.zz LIKE '%65%'


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

вадя , а мы когда-нибудь увидим DDL таблицы, EXPLAIN запроса, и ответ на вопрос miksoftТак селективность условий какая?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700731
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE uhtt.xxx (
  ID int(11) DEFAULT NULL,
  UPCEAN bigint(20) DEFAULT NULL,
  Name varchar(255) DEFAULT NULL,
  CategoryID int(11) DEFAULT NULL,
  CategoryName varchar(150) DEFAULT NULL,
  BrandID int(11) DEFAULT NULL,
  BrandName varchar(100) DEFAULT NULL,
  id_ int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  zz varchar(500) GENERATED ALWAYS AS (CONCAT_WS(' ', `Name`, `BrandName`)) VIRTUAL,
  PRIMARY KEY (id_)
)
ENGINE = INNODB,
AUTO_INCREMENT = 2925499,
AVG_ROW_LENGTH = 69,
CHARACTER SET utf8,
COLLATE utf8_general_ci;

ALTER TABLE uhtt.xxx
ADD INDEX IDX_xxx_UPCEAN (UPCEAN);

ALTER TABLE uhtt.xxx
ADD INDEX IDX_xxx_zz (zz);



Код: sql
1.
2.
3.
4.
5.
6.
EXPLAIN 
SELECT
 *
FROM xxx
WHERE xxx.zz LIKE '%зяй%'
AND xxx.zz LIKE '%65%'




"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"1"SIMPLE""xxx"null"ALL"nullnullnullnull30360841,23"Using where"


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN
SELECT
  *
FROM (SELECT
    *
  FROM xxx
  WHERE ((xxx.zz LIKE '%зяй%'))) xx
WHERE (xx.zz LIKE '%65%')



"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"1"SIMPLE""xxx"null"ALL"nullnullnullnull30360841,23"Using where"
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700733
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaКонечно. К тому же "второй по тексту" вовсе не означает "второй при выполнении".т.е. если первое условие не удовлетворяет , а значит бессмысленно проверять второе, второе всё равно будет проверено?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700742
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадявторое всё равно будет проверено?Да.

По EXPLAIN - оптимизатор явно развернул подзапрос.

По селективности: покажите результат запроса
Код: sql
1.
2.
SELECT COUNT(*), SUM(zz LIKE '%зяй%'), SUM(zz LIKE '%65%'), SUM(zz LIKE '%зяй%' AND zz LIKE '%65%')
FROM xxx 



А также - раз
Код: sql
1.
zz varchar(500) GENERATED ALWAYS AS (CONCAT_WS(' ', `Name`, `BrandName`)) VIRTUAL,

, то дополнительный вопрос - указанные подстроки могут встречаться как в Name, так и в BrandName?
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700743
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
EXPLAIN 
SELECT
  xxx.ID,
  xxx.UPCEAN,
  xxx.Name,
  xxx.BrandName
FROM xxx
WHERE IF((xxx.zz LIKE '%зяйственн%'), IF((xxx.zz LIKE '%65%'), 1, 0), 0) = 1


"id""select_type""table""partitions""type""possible_keys""key""key_len""ref""rows""filtered""Extra"1"SIMPLE""xxx"null"ALL"nullnullnullnull3036084100,0"Using where"
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700747
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote Akina], то дополнительный вопрос - указанные подстроки могут встречаться как в Name, так и в BrandName?[/quoteсоздаётся "универсальный" поиск, т.е. считается, что заранее неизвестно где может втретиться
Код: sql
1.
2.
SELECT COUNT(*), SUM(zz LIKE '%зяй%'), SUM(zz LIKE '%65%'), SUM(zz LIKE '%зяй%' AND zz LIKE '%65%')
FROM xxx 



"COUNT(*)""SUM(zz LIKE '%зяй%')""SUM(zz LIKE '%65%')""SUM(zz LIKE '%зяй%' AND zz LIKE '%65%')"2925390"1419""32344""39"
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700752
Ivan Durak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полнотекстовый поиск тебе поможет он для этого и придуман.
...
Рейтинг: 0 / 0
Как оптимизировать выбор с like и AND
    #39700758
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  *
FROM (SELECT
    *
  FROM xxx
  WHERE ((xxx.zz LIKE '%зяйственн%'))) xx
WHERE (xx.zz LIKE '%65%')

Код: sql
1.
2.
3.
4.
SELECT
    *
  FROM xxx
  WHERE xxx.zz LIKE '%зяйственн%' AND xxx.zz LIKE '%65%'

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  xxx.ID,
  xxx.UPCEAN,
  xxx.Name,
  xxx.BrandName
FROM xxx
WHERE IF((xxx.zz LIKE '%зяйственн%'), IF((xxx.zz LIKE '%65%'), 1, 0), 0)

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


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