На всех условиях есть index.
SELECT u.timestamp ,u.login, app.id appId, a.id aId, b.id bId, ah.id ahId, ah.date_time, ah.as_revealed, ah.user_id, ah.barrier_id
FROM `user` u
LEFT JOIN attribut_app app ON u.id = app.user_id
LEFT JOIN barrier b ON app.barrier_id = b.id AND b.manager_id IS NULL /*не будет работать если у объекта появится */
LEFT JOIN access a ON SUBSTRING(u.login,2) = SUBSTRING(a.access_number,2) AND deleted = '0000-00-00 00:00:00' /*получаем все возможные доступы это ползователя по нашим */
LEFT JOIN access_history ah ON DATE_SUB(NOW(), INTERVAL 30 DAY ) <= ah.date_time AND (ah.access_id = a.id OR ah.user_id = app.user_id) /*история за полседние 30 дней*/
WHERE u.key IS NOT NULL
ORDER BY u.timestamp DESC
Если убрать этот кусок запрос проходит OR ah.user_id = app.user_id
Все что в join по отдельности проходят.