Моего MySQL запрос выглядит следующим образом:Перезаписывающий запрос для удаления FIND_IN_SET?
SELECT pages.*,
showcase.*,
project.*
FROM pages
INNER JOIN showcase ON showcase.pid = pages.uid AND showcase.deleted != 1
INNER JOIN project ON FIND_IN_SET(project.uid, showcase.projects)
WHERE pages.deleted != 1
AND pages.pid = 14
AND pages.dokType = 150
Проблема является вторым INNER JOIN
- он использует FIND_IN_SET
потому витрина (= коллекция проектов) сохраняет свои проекты, как разделенный запятыми списка в поле showcase.projects
. FIND_IN_SET
Невозможно использовать индексы, насколько мне известно, поэтому для второго соединения требуется полное сканирование таблицы проекта. Любая возможность использовать индекс без изменения схемы базы данных?
Угадайте, что вы правы, я начну нормализовать данные в понедельник. Конечно, лучшее решение. – Max
Удачи. Просто не уходите от дезадаптации к нормализации :) Это может привести к повышению производительности/решению проблем данных в будущем. –