Оптимизация запросов - PullRequest
       18

Оптимизация запросов

2 голосов
/ 27 августа 2009

У меня 2 запроса.

Первый:

SELECT * FROM `table` WHERE col='xyz' LIMIT 100
//Time Taken: 0.0047s

Второе:

SELECT * FROM `table` WHERE col='xyz' ORDER BY Id DESC LIMIT 100
//Time Taken: 1.8208s

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

Можно ли каким-либо образом ORDER BY использовать другой метод, например, выбрать последние 100 строк и затем выполнить порядок? Или я неправильно делаю запрос, и он может быть выполнен быстрее?

Обратите внимание, что идентификатором является автоинкремент, поэтому выбор последних строк все равно вернет правильные данные, когда они упорядочены.

CREATE TABLE `table`(
    `Id` BIGINT NOT NULL AUTO_INCREMENT,
    `dateReg` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY (`Id`)
) ENGINE=MyISAM

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Для последовательных идентификаторов:

SELECT t.*
  FROM TABLE t
  JOIN (SELECT MAX(t.id) 'maxid'
          FROM TABLE t) max ON t.id BETWEEN max.maxid-100 AND max.maxid
 WHERE t.col = 'xyz' 

Для непоследовательных идентификаторов:

SELECT a.*
  FROM (SELECT t.*,
               @rownum := @rownum+1 AS rownum
          FROM TABLE t, (SELECT @rownum := 0) r
         WHERE t.col = 'xyz') a,
       (SELECT COUNT(t.*) 'max'
          FROM TABLE t
         WHERE t.col = 'xyz') m
WHERE a.rownum BETWEEN m.max-100 AND m.max
1 голос
/ 27 августа 2009

Создайте составной индекс для (col, id), если вы используете MyISAM для своей таблицы.

В InnoDB PRIMARY KEY неявно включается в вашу таблицу как указатель строки, так как InnoDB таблицы организованы по индексу по дизайну.

В случае InnoDB, чтобы создать составной индекс для (col, id), достаточно создать индекс для col и убедиться, что id является PRIMARY KEY.

Этот индекс будет использоваться для фильтрации по col и порядка по id.

Индекс представляет собой структуру B-Tree, поэтому он может повторять ASC и DESC с одинаковой эффективностью.

0 голосов
/ 27 августа 2009

Ваш столбец идентификатора должен быть установлен в качестве первичного ключа (или, если у вас есть какой-то другой первичный ключ, вы все равно должны поместить в него индекс). Это должно ускорить запрос достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...