Код вроде
$banner->hits++;
$banner->save();
точно имеет смысл рефакторить, т.к. если он будет исполняться параллельно, то значение счетчика будет неверным. Если два пользователя получат одно и то же текущее значение счетчика (например, 1000), прибавят к нему единицу и попытаются сохранить, то получится 1001, а не 1002, как должно бы быть
Навскидку, вторая задача запросом без UNION решается так:
SELECT i2.*
FROM photo_image i1
INNER JOIN photo_image i2 ON (i2.is_published=1) AND (i1.g_id=i2.g_id) AND (i2.ordi > i1.ordi)
WHERE i1.id=?
ORDER BY i2.ordi
LIMIT 1
Кстати, XnView позволяет не только просматривать картинки, но и проводить несложную обработку фотографий — ресайз (причем несколько алгоритмов на выбор), кадрирование, поворот, можно подправить яркость, контраст и еще несколько параметров, есть какие-то фильтры. Лично мне XnView заменяет не только ACDSee, но и PhotoShop, который я только для этих операций и использовал.
А вы не пробовали выносить статистику в отдельную таблицу?
$banner->hits++;
$banner->save();
точно имеет смысл рефакторить, т.к. если он будет исполняться параллельно, то значение счетчика будет неверным. Если два пользователя получат одно и то же текущее значение счетчика (например, 1000), прибавят к нему единицу и попытаются сохранить, то получится 1001, а не 1002, как должно бы быть
SELECT i2.*
FROM photo_image i1
INNER JOIN photo_image i2 ON (i2.is_published=1) AND (i1.g_id=i2.g_id) AND (i2.ordi > i1.ordi)
WHERE i1.id=?
ORDER BY i2.ordi
LIMIT 1