Mysql, нужен совет по объединению и индексам по моему запросу, также есть раунд (count (field) / 20 +1) - PullRequest
2 голосов
/ 20 января 2011

Я пытаюсь улучшить свой запрос, я делаю подсчет всех записей, относящихся к определенной категории, я также делаю сумму, чтобы подсчитать, сколько страниц в каждой категории нужно будет показать всем записи в этой категории.

Я хочу улучшить скорость запроса. Я не уверен на 100%, являются ли объединение и индексы наиболее эффективными.

Я пробовал LIMIT на 5, и это не имеет значения.

Вот мой запрос

SELECT PageBase, round((count(pads.padid) / 20) + 1) as totpages FROM 
categories, pads WHERE pads.catid = categories.catid AND 
`RemoveMeDate` = '2001-01-01 00:00:00' group by categories.catid LIMIT 50,50

Вот объяснение

alt text

Вот структура таблицы категорий

CREATE TABLE categories (
  CatID int(11) NOT NULL DEFAULT '0',
  NewASP text NOT NULL,
  `Specific` text NOT NULL,
  PageBase varchar(50) NOT NULL,
 PRIMARY KEY (CatID),
 KEY PageBase (PageBase)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Вот запрос, выполняющийся

alt text

1 Ответ

0 голосов
/ 20 января 2011

Что-нибудь из этого работает лучше? Пожалуйста, покажите выход 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 равен нулю до подсчета (в этом запросе мы знаем, что он не может быть нулевым).

...