Nedanstående är helt otestat. Dessutom kör jag inte MySQL till vardags.
Du vill ha index på log_activity.log_create_timestamp och log_activity.log_create_user_id så att det går snabbt att söka där. users.user_id förutsätter jag är primary key, så där behöver du antagligen inget index.
Din MAX(log_create_timestamp) kommer inte att returnera det du vill, den kommer inte köra per log_create_user_id utan på hela svaret, alla rader kommer alltså ha samma värde.
Din nuvarande fråga tar ut alla loggrader för alla användare, vilket gör att du får en väldig massa kandidatrader i den kartesiska produkten mellan loggrader och användare innan WHERE-villkoret hanteras, vilket triggar felet. Försök få ner antalet kandidatrader.
Det svåra är att få ut den senaste loggraden per användare, inklusive loggmeddelandet, från loggtabellen, vilket gör att GROUP BY (log_create_user_id) inte skulle fungera. Testa med PARTITION BY i stället.
Typ:
SELECT
users.your_username_field,
latestLogsPerUser.your_log_message_fieldname,
latestLogsPerUser.log_create_timestamp,
FROM
users JOIN
(SELECT
ROW_NUMBER() OVER(PARTITION BY log_create_user_id ORDER BY log_create_timestamp DESC) rowNumber,
your_log_message_fieldname,
log_create_timestamp
log_create_user_id,
FROM log_activity WHERE rowNumber = 1) latestLogsPerUser
ON users.user_id = latestLogsPerUser.log_create_user_id
Som sagt, jag har inte ens testat syntaxen i det ovanstående, det är en skiss. Börja med att testa den inre SELECTen och se till att den fungerar, sedan bör det vara trivialt att JOINA in de fält du vill ha från användartabellen.
I värsta fall får du ge dig på det faktiska felmeddelandet, men prio bör vara att få till en fungerande fråga först.