Что-нибудь из этого работает лучше? Пожалуйста, покажите выход EXPLAIN.
Это превращает его в подзапрос, который, надеюсь, выполняется после предложения limit. РЕДАКТИРОВАТЬ: это не похоже.
SELECT PageBase,
floor((ifnull((select count(*) from pads
where pads.catid = categories.catid
AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages
FROM categories
LIMIT 50,50
Это вынуждает его завершить 50,50, который, как мы надеемся, совсем не занимает времени, затем выполняет 50 подзапросов подсчета.
SELECT PageBase,
floor((ifnull((
select count(1) from pads
where pads.catid = C.catid
AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages
FROM (
SELECT PageBase, CatID
FROM categories
LIMIT 50,50) C
К вашему сведению, количество (1) и количество (*) совпадают. count (pads.catid) может быть немного медленнее, потому что он должен сработать, если pads.catid равен нулю до подсчета (в этом запросе мы знаем, что он не может быть нулевым).