powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql slow query
9 сообщений из 9, страница 1 из 1
mysql slow query
    #39040248
das-ich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет.

потребовалось запустить slow query log и там появился вот такой запрос.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 SELECT U.*, DATE_FORMAT(U.TIMESTAMP_X, '%d.%m.%Y %H:%i:%s') TIMESTAMP_X, 
IF(U.LAST_ACTIVITY_DATE > DATE_SUB(NOW(), 
INTERVAL 120 SECOND), 'Y', 'N') IS_ONLINE, 
DATE_FORMAT(U.DATE_REGISTER, '%d.%m.%Y %H:%i:%s') DATE_REGISTER, 
DATE_FORMAT(U.LAST_LOGIN, '%d.%m.%Y %H:%i:%s') LAST_LOGIN, 
DATE_FORMAT(U.PERSONAL_BIRTHDAY, '%d.%m.%Y') PERSONAL_BIRTHDAY  
FROM b_user U 
WHERE (1=1 AND (((upper(U.EMAIL) like upper('%uggjplove13@gmail.com%') and U.EMAIL is not null)))) 
ORDER BY U.ID ASC;



я в мускуле не особо, но как понимаю этот запрос создает какую-то виртуальную таблицу и потом из нее делает выборку. правильно?

вот что explain выдает:
+----+-------------+-------+-------+--------------------------+---------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+--------------------------+---------+---------+------+--------+-------------+
| 1 | SIMPLE | U | index | ix_b_user_email,email_id | PRIMARY | 4 | NULL | 105296 | Using where |
+----+-------------+-------+-------+--------------------------+---------+---------+------+--------+-------------+

то есть этот запрос проверяет 105296 строк.

нельзя ли как нибудь сделать так чтоб он использовал идексы, что б его ускорить, или при таком запросе индексы не как не сделаешь и надо переписывать его с использованием временной таблицы например?
...
Рейтинг: 0 / 0
mysql slow query
    #39040259
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
покажите имеющиеся индексы на таблицу B_USER
а вообще LIKE не сначала строки не будет использовать индексы ------- upper('%uggjplove13@gmail.com%')
как то надо переделать
...
Рейтинг: 0 / 0
mysql slow query
    #39040279
das-ich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
+---------------------+--------------+------+-----+-------------------+-----------------------------+
| Field               | Type         | Null | Key | Default           | Extra                       |
+---------------------+--------------+------+-----+-------------------+-----------------------------+
| ID                  | int(18)      | NO   | PRI | NULL              | auto_increment              |
| TIMESTAMP_X         | timestamp    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| LOGIN               | varchar(50)  | NO   | MUL | NULL              |                             |
| PASSWORD            | varchar(50)  | NO   |     | NULL              |                             |
| CHECKWORD           | varchar(50)  | YES  |     | NULL              |                             |
| ACTIVE              | char(1)      | NO   |     | Y                 |                             |
| NAME                | varchar(50)  | YES  |     | NULL              |                             |
| LAST_NAME           | varchar(50)  | YES  |     | NULL              |                             |
| EMAIL               | varchar(255) | YES  | MUL | NULL              |                             |
| LAST_LOGIN          | datetime     | YES  |     | NULL              |                             |
| DATE_REGISTER       | datetime     | NO   | MUL | NULL              |                             |
| LID                 | char(2)      | YES  |     | NULL              |                             |
| PERSONAL_PROFESSION | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_WWW        | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_ICQ        | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_GENDER     | char(1)      | YES  |     | NULL              |                             |
| PERSONAL_BIRTHDATE  | varchar(50)  | YES  | MUL | NULL              |                             |
| PERSONAL_PHOTO      | int(18)      | YES  |     | NULL              |                             |
| PERSONAL_PHONE      | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_FAX        | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_MOBILE     | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_PAGER      | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_STREET     | text         | YES  |     | NULL              |                             |
| PERSONAL_MAILBOX    | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_CITY       | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_STATE      | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_ZIP        | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_COUNTRY    | varchar(255) | YES  |     | NULL              |                             |
| PERSONAL_NOTES      | text         | YES  |     | NULL              |                             |
| WORK_COMPANY        | varchar(255) | YES  |     | NULL              |                             |
| WORK_DEPARTMENT     | varchar(255) | YES  |     | NULL              |                             |
| WORK_POSITION       | varchar(255) | YES  |     | NULL              |                             |
| WORK_WWW            | varchar(255) | YES  |     | NULL              |                             |
| WORK_PHONE          | varchar(255) | YES  |     | NULL              |                             |
| WORK_FAX            | varchar(255) | YES  |     | NULL              |                             |
| WORK_PAGER          | varchar(255) | YES  |     | NULL              |                             |
| WORK_STREET         | text         | YES  |     | NULL              |                             |
| WORK_MAILBOX        | varchar(255) | YES  |     | NULL              |                             |
| WORK_CITY           | varchar(255) | YES  |     | NULL              |                             |
| WORK_STATE          | varchar(255) | YES  |     | NULL              |                             |
| WORK_ZIP            | varchar(255) | YES  |     | NULL              |                             |
| WORK_COUNTRY        | varchar(255) | YES  |     | NULL              |                             |
| WORK_PROFILE        | text         | YES  |     | NULL              |                             |
| WORK_LOGO           | int(18)      | YES  |     | NULL              |                             |
| WORK_NOTES          | text         | YES  |     | NULL              |                             |
| ADMIN_NOTES         | text         | YES  |     | NULL              |                             |
| STORED_HASH         | varchar(32)  | YES  |     | NULL              |                             |
| XML_ID              | varchar(255) | YES  | MUL | NULL              |                             |
| PERSONAL_BIRTHDAY   | date         | YES  |     | NULL              |                             |
| EXTERNAL_AUTH_ID    | varchar(255) | YES  |     | NULL              |                             |
| CHECKWORD_TIME      | datetime     | YES  |     | NULL              |                             |
| SECOND_NAME         | varchar(50)  | YES  |     | NULL              |                             |
| CONFIRM_CODE        | varchar(8)   | YES  |     | NULL              |                             |
| LOGIN_ATTEMPTS      | int(18)      | YES  |     | NULL              |                             |
| LAST_ACTIVITY_DATE  | datetime     | YES  | MUL | NULL              |                             |
| AUTO_TIME_ZONE      | char(1)      | YES  |     | NULL              |                             |
| TIME_ZONE           | varchar(50)  | YES  |     | NULL              |                             |
| TIME_ZONE_OFFSET    | int(18)      | YES  |     | NULL              |                             |
| TITLE               | varchar(255) | YES  |     | NULL              |                             |
| BX_USER_ID          | varchar(32)  | YES  |     | NULL              |                             |
| LANGUAGE_ID         | char(2)      | YES  |     | NULL              |                             |
+---------------------+--------------+------+-----+-------------------+-----------------------------+




я добавил на PERSONAL_BIRTHDATE, DATE_REGISTER их не было и добавил составной на email и id.
...
Рейтинг: 0 / 0
mysql slow query
    #39040351
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
das-ichдобавил составной на email и id.попробуйте наоборот - на ID, EMAIL. И после создания индекса сделайте OPTIMIZE TABLE.
...
Рейтинг: 0 / 0
mysql slow query
    #39040352
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
das-ichя добавил на PERSONAL_BIRTHDATE, DATE_REGISTERДля показанного запроса они не нужны.

Таблица, надеюсь, InnoDB-шная?
...
Рейтинг: 0 / 0
mysql slow query
    #39040354
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо как-то избавиться от авторLIKE % uggjplove13@gmail.com% .
Почему проверка емайла идет с %?
...
Рейтинг: 0 / 0
mysql slow query
    #39040355
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
das-ich,

все твои предположения -- сразу мимо.
по оптимизации:
Вот твои условия:
Код: sql
1.
(1=1 AND (((upper(U.EMAIL) like upper('%uggjplove13@gmail.com%') and U.EMAIL is not null)))) 



Эффективно это
Код: sql
1.
2.
upper(U.EMAIL) like upper('%uggjplove13@gmail.com%') 
and U.EMAIL is not null




Нахрена так много скобок ставить было ? ни одна не нужна...


Два условия,
Код: plaintext
1.
U.EMAIL is not null
upper(U.EMAIL) like upper('%uggjplove13@gmail.com%') 

Оба на EMAIL,
первое неселективное наверняка (наверняка поле EMAIL большей частью заполнено),
второе -- неоптимизируемо индексом. Индекс надо было бы делать на upper(U.EMAIL), но MySQL не поддерживает индексы на выражения (если поддерживает вдруг в твоей версии -- тогда просто надо создать
такой индекс).

ИТОГО: два условия отбора, ни одно не оптимизируемо, следовательно, запрос не оптимизируется вообще никак.

Как быть:

Условие
Код: plaintext
1.
upper(U.EMAIL) like upper('%uggjplove13@gmail.com%') 

надо заменять на условие
Код: plaintext
1.
U.EMAIL like 'uggjplove13@gmail.com%'

Т.е. во-первых, надо убрать с EMAIL UPPER(), для этого данные нужно держать в таблице уже преобразованными к какому-то регистру, во вторых, надо сделать условие с LIKE префиксным, а не инфиксным -- убрать в начале '%', потому что только префиксные условия LIKE могут быть оптимизированы с использованием индекса. Как тебе этого добиться -- решай исходя из своей предметной области.
...
Рейтинг: 0 / 0
mysql slow query
    #39040368
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНахрена так много скобок ставить было ? ни одна не нужна...Это Битрикс. Он скобки сыпет тоннами. И по этой же причине запрос правке не поддается.
...
Рейтинг: 0 / 0
mysql slow query
    #39040432
das-ich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
понял спасибо большое.
буду пинать наших разрабов сайта. пусть сами с битриксом разбираются
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / mysql slow query
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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