Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56
1

Оптимизация запроса

17.01.2017, 14:52. Показов 424. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!!

Есть таблица с полем rfid. в Нем через запятую хранятся записи (не более четырех), например, "12ввв,вуакп44ваа,к33аа33аа,ааа55рр55р6"
и есть другая таблица device_message, в которой хранятся записи, в одном из полей которой хранится одна из частей поля rfid первой таблицы, например, "к33аа33аа". Так вот. Суть задачи в том, чтобы оптимизировать скорость выполнения запроса. Выполняется ОЧЕНЬ долго.

Немного предистории : когда в поле rfid была одна запись (например, "12ввв"), то запрос такого формата
SQL
1
SELECT NOT dm.check_point_id = 33 FROM device_message dm WHERE dm.tagid = rfid AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE dm.tagid = rfid)
отрабатывал на ура.
Пробовал в таблице создать доп. 3 поля и разбить поле rfid на 4 поля (это не критично для меня, могу добавить, а могу и не добавлять ), запрос получился такой:
SQL
1
SELECT NOT dm.check_point_id = 33 FROM device_message dm WHERE (dm.tagid = rfid OR dm.tagid = rfid2 OR dm.tagid = rfid3 OR dm.tagid = rfid4) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE (dm.tagid = rfid OR dm.tagid = rfid2 OR dm.tagid = rfid3 OR dm.tagid = rfid4))
Пробовал такой:
SQL
1
(SELECT NOT dm.check_point_id = 33 FROM device_message dm WHERE LOCATE(dm.tagid,rfid) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE LOCATE(dm.tagid,rfid)))
Может как-то вообще по-другому построить запрос? Суть запроса, должен вернуть (это в идеале) true/false или 1/0 .

Добавлено через 17 минут
Дополнение. Пишу на Grails, это у меня в домене формульная колонка, поэтому не все запросы тут отрабатывают, например, такой не заработал, хотя, если сделать запрос напрямую к базе, то все норм, возвращает 1 или null

SQL
1
SELECT ((SELECT NOT dm.check_point_id = t.exit_id FROM device_message dm WHERE ((dm.tagid = rfid)) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE dm.tagid = rfid)) OR (SELECT NOT dm.check_point_id = t.exit_id FROM device_message dm WHERE ((dm.tagid = rfid2)) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE dm.tagid = rfid2)) OR (SELECT NOT dm.check_point_id = t.exit_id FROM device_message dm WHERE ((dm.tagid = rfid3)) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE dm.tagid = rfid3)) OR (SELECT NOT dm.check_point_id = t.exit_id FROM device_message dm WHERE ((dm.tagid = rfid4)) AND dm.id = (SELECT MAX(dm.id) FROM device_message dm WHERE dm.tagid = rfid4))),t.* FROM transport t
Добавлено через 4 минуты
Все поля проиндексированы
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2017, 14:52
Ответы с готовыми решениями:

Оптимизация запроса
Добрый день. Подскажите как по человечески построить запрос: нужно получать данные по сотрудникам...

Оптимизация запроса
Здравствуйте! Столкнулся с такой проблемой, мне нужно выполнить запрос вида: SELECT `id` FROM...

Оптимизация запроса
Здравствуйте. Ломаю голову об оптимизации запроса. Есть две таблицы CREATE TABLE `test` (...

Оптимизация запроса
Добрый день, есть вот такой запрос: select id, content, vote from table1 where DATE_FORMAT(date,...

4
17 / 17 / 4
Регистрация: 10.05.2015
Сообщений: 60
17.01.2017, 15:31 2
Я бы сделал новую таблицу для данных из поля rfid, как только там появилось более одного значения.
И конечно связал бы новую таблицу c старой через foreng key

А потом бы уже над оптимальным запросом думал.
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
17.01.2017, 15:59 3
Цитата Сообщение от socslm Посмотреть сообщение
Я бы сделал новую таблицу для данных из поля rfid, как только там появилось более одного значения.
+100500
0
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 56
17.01.2017, 18:00  [ТС] 4
в отдельную таблицу не получится, т.к. все данные из первой таблицы, где основное поле rfid, выводятся в списочную форму, в которой есть фильтрация и сортировка (jqgrid использую)
0
Модератор
4217 / 3058 / 583
Регистрация: 21.01.2011
Сообщений: 13,205
18.01.2017, 11:16 5
Цитата Сообщение от mrkid Посмотреть сообщение
все данные из первой таблицы, где основное поле rfid, выводятся в списочную форму
Структура данных в БД никоим образом не должна зависеть от отображения данных. Если отображение мешает оптимальной структуре, нужно менять отображение.
0
18.01.2017, 11:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.01.2017, 11:16
Помогаю со студенческими работами здесь

Оптимизация запроса
Здравствуйте, проблема в следующем, время генерации страницы без запроса ниже: 0,00702, с ним около...

Оптимизация запроса
Народ, добрый, подскажите. Можно ли оптимизировать запрос так, чтобы сократить время выполнения. ...

Оптимизация запроса
Идет поиск по полю date_added(TIMESTAMP) ... WHERE DATE(date_added) = '2017-09-02' Как и...

оптимизация запроса
Помогите оптимизировать такой запрос.. Выполняется около секунды..использую сортировку по 2...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru