h2database очень медленно по порядку - PullRequest
1 голос
/ 20 августа 2011

У меня есть Java-апплет, в который была добавлена ​​база данных h2, и таблица с 200 000 строк.

Таблица:

    CREATE TABLE `DB`.`TEST` (
        `id` INT UNSIGNED PRIMARY KEY,
        `from` VARCHAR(80)  NOT NULL,
        `from_group` SMALLINT UNSIGNED,
        `to` VARCHAR(80)  NOT NULL,
        `to_group` SMALLINT UNSIGNED,
        `type` SMALLINT UNSIGNED NOT NULL,
        `class` SMALLINT UNSIGNED NOT NULL,
        `direction` TINYINT UNSIGNED NOT NULL,
        `start` TIMESTAMP  NOT NULL,
        `answer` TIMESTAMP ,
        `end` TIMESTAMP NOT NULL,
        `duration` INT UNSIGNED,
        `bill` INT UNSIGNED,
        `cost` FLOAT UNSIGNED
    )

Когда я делаю простой запрос SELECT * FROM DB. TEST ORDER BY id ASC LIMIT 50 - он отлично работает около 3-4 мс.Но при изменении порядка на desc ситуация меняется, и запрос занимает около 8-10 секунд.

В любом случае решение сделать заказ быстрее?

Спасибо

Ответы [ 2 ]

4 голосов
/ 20 августа 2011

Выполняя заказ по неиндексированному столбцу, вы заставляете свою базу данных сканировать каждую строку для сравнения значений.Лучше всего создать индекс для строки, по которой вы хотите отсортировать.http://www.h2database.com/html/performance.html#storage_and_indexes.
h2db также спроектирован медленно на больших объемах данных.
Синтаксис будет добавлять это после вашего CREATE TABLE DDL:

CREATE INDEX IDX_TO ON DB.TEST(TO);  

При добавлении индексов имейте в виду, чтобаза данных имеет больше работы для вставки, обновления и удаления.Поэтому соблюдайте их как минимум.

Примечание. Исходный запрос сортировки по идентификатору выполняет сортировку по первичному ключу базы данных, который является индексированным столбцом, и поэтому он выполняется быстрее.

3 голосов
/ 20 августа 2011

H2 требует, чтобы вы создали нисходящий индекс в этом случае:

CREATE INDEX IDX_TO_DESC ON DB.TEST(TO DESC);  

Это означает, что индекс сортирует этот столбец в порядке убывания .

...