Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / а как быть с LIKE по цифре ? Не работают индексы / 25 сообщений из 39, страница 1 из 2
01.06.2017, 18:56
    #39464067
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
вот например ищем паспорт на лету, по мере ввода
4506 это серия, 123456 это №
ввели 45, ищет LIKE '45%', но `passSer` это SMALLINT, а `passNum` это MEDIUMINT, т.е. INTы
а '45%' это, я так понимаю, STRING
т.е. это разные типы строк, поэтому облом...
короче в example не работают кеи в таком варианте
если писать =4506, то работают
а без кеев притормаживает уже...
и что делать? в стринги серию и № перегонять? и с телефонами также??
...
Рейтинг: 0 / 0
01.06.2017, 19:16
    #39464070
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
*не example, а explain
...
Рейтинг: 0 / 0
01.06.2017, 19:55
    #39464094
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78ввели 45, ищет LIKE '45%', но `passSer` это SMALLINT, а `passNum` это MEDIUMINT, т.е. INTы
а '45%' это, я так понимаю, STRING
т.е. это разные типы строк, поэтому облом...Бред. Like работает ТОЛЬКО со строковым типом данных, любые другие приводятся к нему перед выполнением оператора:
Код: sql
1.
2.
3.
4.
5.
6.
7.
mysql> SELECT 4506 LIKE '45%';
+-----------------+
| 4506 LIKE '45%' |
+-----------------+
|               1 |
+-----------------+
1 row in set (0.00 sec)
...
Рейтинг: 0 / 0
01.06.2017, 20:44
    #39464124
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
ага... так, я сейчас заметил, что без ORDER BY оно таки летает...
в общем такой вот запрос
Код: sql
1.
2.
3.
4.
SELECT * FROM `table` AS t1
LEFT OUTER JOIN `phones` AS t2 ON t1.id=t2.cid
WHERE (t1.passSer LIKE '45%') OR (t2.code LIKE '45%')
LIMIT 15


это поиск по мере ввода по паспорту и по телефону
он работает за 0.02
а если ему добавить ORDER BY `name3` (по фамилии), то 0.40
индекс на `name3` есть
как и на все поля в LIKE (причём там и смежные индексы есть, это я потом добавил одиночные)
с чем это связано?
...
Рейтинг: 0 / 0
01.06.2017, 21:38
    #39464150
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
Показывайте EXPLAIN. Только цитатой с консоли в тегах кода, а не скриншотом...
Но вообще OR во WHERE следует избегать. Лучше переделайте на UNION.
...
Рейтинг: 0 / 0
01.06.2017, 21:46
    #39464155
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
| 1 | SIMPLE | t1 | NULL | index | pass,passSer | name3 | 767 | NULL | 18 | 100.00 | NULL |
| 1 | SIMPLE | t2 | NULL | ref | clientID | clientID | 3 | table.t1.id | 1 | 100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
...
Рейтинг: 0 / 0
01.06.2017, 22:09
    #39464165
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
Ну а DDL где?
...
Рейтинг: 0 / 0
01.06.2017, 22:18
    #39464168
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
это чтоли?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref                | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
|  1 | SIMPLE      | t1    | NULL       | index | pass,passSer  | name3    | 767     | NULL               |   15 |   100.00 | NULL        |
|  1 | SIMPLE      | t2    | NULL       | ref   | clientID      | clientID | 3       | table.t1.id |    1 |   100.00 | Using where |
+----+-------------+-------+------------+-------+---------------+----------+---------+--------------------+------+----------+-------------+
2 rows in set, 1 warning (0,01 sec)

Note (Code 1003): /* select#1 */ select `table`.`t1`.`id` AS `id`,`table`.`t1`.`name3` AS `name3` from `table`.`clients` `t1` left join `table`.`phones` `t2` on((`table`.`t2`.`clientID` = `table`.`t1`.`id`)) where ((`table`.`t1`.`passSer` like '45%') or (`table`.`t2`.`code` like '45%')) order by `table`.`t1`.`name3` limit 15



warning, кстати, хз о чём...
...
Рейтинг: 0 / 0
01.06.2017, 22:43
    #39464175
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78
Код: sql
1.
`table`.`t2`.`clientID`

Это что за мутант? У вас `table` - это схема?
...
Рейтинг: 0 / 0
01.06.2017, 22:47
    #39464177
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
miksofttip78
Код: sql
1.
`table`.`t2`.`clientID`

Это что за мутант? У вас `table` - это схема?
нет, название там нормальное
...
Рейтинг: 0 / 0
01.06.2017, 22:49
    #39464179
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78miksoftпропущено...
Это что за мутант? У вас `table` - это схема?
нет, название там нормальноеа что в этой конструкции означает `table` ? И зачем оно?
...
Рейтинг: 0 / 0
01.06.2017, 22:54
    #39464181
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
miksofttip78пропущено...

нет, название там нормальноеа что в этой конструкции означает `table` ? И зачем оно?
ну там название таблицы было, я его поменял просто
...
Рейтинг: 0 / 0
01.06.2017, 22:55
    #39464182
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78miksoftпропущено...
а что в этой конструкции означает `table` ? И зачем оно?
ну там название таблицы было, я его поменял простоТогда почему конструкция состоит из трех частей, а не двух? Что-то напутали при замене?
...
Рейтинг: 0 / 0
01.06.2017, 23:21
    #39464189
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
не, так explain выдаёт, я только название поменял
...
Рейтинг: 0 / 0
02.06.2017, 00:00
    #39464194
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
AkinaПоказывайте EXPLAIN. Только цитатой с консоли в тегах кода, а не скриншотом...
Но вообще OR во WHERE следует избегать. Лучше переделайте на UNION.
немного не понял, а что должно получиться без WHERE ?
будет 2 селекта, 1 с джойном, но там же в одном всё-равно будет WHERE passSer LIKE '45%', а в другом WHERE code LIKE '45%', не?
...
Рейтинг: 0 / 0
02.06.2017, 00:06
    #39464195
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
вот так он работает за 0.09
Код: sql
1.
2.
3.
4.
5.
(SELECT `id`,`name3`,passser,passnum FROM `clients` WHERE `passSer` LIKE '45%')
UNION ALL
(SELECT `id`,`name3`,t2.code,t2.num FROM `clients` AS `t1`
JOIN `phones` AS t2 ON t1.`id`=t2.`clientID`
WHERE t2.`code` LIKE '45%') ORDER BY name3 LIMIT 15;



я всё правильно сделал?
...
Рейтинг: 0 / 0
02.06.2017, 00:07
    #39464196
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
miksofttip78пропущено...

ну там название таблицы было, я его поменял простоТогда почему конструкция состоит из трех частей, а не двух? Что-то напутали при замене?
извините, спать хочу, там конечно не название таблицы, а название БД было
...
Рейтинг: 0 / 0
02.06.2017, 07:37
    #39464219
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78я всё правильно сделал?
Ну да, это больше похоже на правду.
Есть только одна мелочь - если каждый из подзапросов вернёт одну и ту же запись, и она попадёт в лимит - отобразится дубликат. А для исправления ORDER BY и LIMIT надо ещё добавить в каждый из подзапросов, и заменить UNION ALL на UNION DISTINCT...
...
Рейтинг: 0 / 0
02.06.2017, 09:24
    #39464273
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
tip78warning, кстати, хз о чём...
В варнинг пишется переписанный оптимизатором текст запроса. Нормализованный по именам идентификаторов, поэтому обращения к таблицам/полям развёрнуты в полные.
...
Рейтинг: 0 / 0
02.06.2017, 10:09
    #39464306
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
Akinatip78я всё правильно сделал?
Ну да, это больше похоже на правду.
Есть только одна мелочь - если каждый из подзапросов вернёт одну и ту же запись, и она попадёт в лимит - отобразится дубликат. А для исправления ORDER BY и LIMIT надо ещё добавить в каждый из подзапросов, и заменить UNION ALL на UNION DISTINCT...
а когда много столбов выводить и их надо в каждый SELECT писать одни и те же, это можно как-то оптимизировать, в переменную их загнать, например?

Melkijtip78warning, кстати, хз о чём...
В варнинг пишется переписанный оптимизатором текст запроса. Нормализованный по именам идентификаторов, поэтому обращения к таблицам/полям развёрнуты в полные.
ясно, спасибо
...
Рейтинг: 0 / 0
02.06.2017, 10:14
    #39464309
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
кстати, запрос так то не сказать, чтобы лучше стал... там rows вырос, стало 15x42466 = 636990, а было 39358 (кол-во клиентов)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
+----+--------------+------------+------------+--------+-------------------+---------+---------+--------------------------+-------+----------+----------------------------------------------+
| id | select_type  | table      | partitions | type   | possible_keys     | key     | key_len | ref                      | rows  | filtered | Extra                                        |
+----+--------------+------------+------------+--------+-------------------+---------+---------+--------------------------+-------+----------+----------------------------------------------+
|  1 | PRIMARY      | clients    | NULL       | index  | pass              | name3   | 767     | NULL                     |    15 |    11.11 | Using where                                  |
|  2 | UNION        | t2         | NULL       | ALL    | code_num,clientID | NULL    | NULL    | NULL                     | 42466 |    11.11 | Using where; Using temporary; Using filesort |
|  2 | UNION        | t1         | NULL       | eq_ref | PRIMARY,id_ki_src | PRIMARY | 3       | db.t2.clientID |     1 |   100.00 | NULL                                         |
| NULL | UNION RESULT | <union1,2> | NULL       | ALL    | NULL              | NULL    | NULL    | NULL                     |  NULL |     NULL | Using temporary                              |
+----+--------------+------------+------------+--------+-------------------+---------+---------+--------------------------+-------+----------+----------------------------------------------+
4 rows in set, 1 warning (0,01 sec)

Note (Code 1003): (/* select#1 */ select `db`.`clients`.`id` AS `id`,`db`.`clients`.`name3` AS `name3`,`db`.`clients`.`passSer` AS `passser`,`db`.`clients`.`passNum` AS `passnum`
from `db`.`clients` where (`db`.`clients`.`passSer` like '45%')
order by `db`.`clients`.`name3` limit 15)
union (/* select#2 */ select `db`.`t1`.`id` AS `id`,`db`.`t1`.`name3` AS `name3`,`db`.`t2`.`code` AS `code`,`db`.`t2`.`num` AS `num`
from `db`.`clients` `t1`
join `db`.`phones` `t2`
where ((`db`.`t1`.`id` = `db`.`t2`.`clientID`) and (`db`.`t2`.`code` like '45%'))
order by `db`.`t1`.`name3` limit 15)
...
Рейтинг: 0 / 0
02.06.2017, 10:16
    #39464312
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
Код: sql
1.
2.
3.
4.
5.
(SELECT `id`,`name3`,passser,passnum FROM `clients` WHERE `passSer` LIKE '45%' ORDER BY `name3` LIMIT 15)
UNION
(SELECT `id`,`name3`,t2.code,t2.num FROM `clients` AS `t1`
JOIN `phones` AS t2 ON t1.`id`=t2.`clientID`
WHERE t2.`code` LIKE '45%' ORDER BY `name3` LIMIT 15);
...
Рейтинг: 0 / 0
02.06.2017, 10:23
    #39464318
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
и кстати, ZEROFILL не работает в UNION...
если номер телефона такой: 736766, то должен выводить 0736766, ан нет
...
Рейтинг: 0 / 0
02.06.2017, 10:25
    #39464323
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
приходится делать CONVERT(t2.num,CHAR)
...
Рейтинг: 0 / 0
02.06.2017, 10:33
    #39464333
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
а как быть с LIKE по цифре ? Не работают индексы
по кеям тоже непонятно опять, они используются или нет...
если искать 985, то отрабатывает за 0.20, что опять много
походу в редиску надо эти цифры загонять чисто для поиска...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / а как быть с LIKE по цифре ? Не работают индексы / 25 сообщений из 39, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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