h2database在订购时非常慢

时间:2011-08-20 15:19:14

标签: java sql performance h2

我有一个java applet,它嵌入了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 DBTEST ORDER BY id ASC LIMIT 50 - 它的执行时间大约为3-4毫秒。但是当按顺序改变顺序时,情况就会发生变化,查询大约需要8-10秒。

无论如何解决方案要更快地下订单?

由于

2 个答案:

答案 0 :(得分:4)

通过在非索引列上执行订单,您强制数据库扫描每一行以比较值。最好的办法是在要排序的行上创建索引。 http://www.h2database.com/html/performance.html#storage_and_indexes
h2db在大量数据上的设计也很慢 语法是在CREATE TABLE DDL之后添加它:

CREATE INDEX IDX_TO ON DB.TEST(TO);  

添加索引时请记住,数据库在插入,更新和删除方面还有很多工作要做。所以要将它们保持在最低限度。

注意:您按id排序的原始查询正在对数据库的主键进行排序,这是一个索引列,这就是它更快的原因。

答案 1 :(得分:3)

H2要求您在这种情况下创建降序索引:

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

这意味着,索引会对this column in descending order进行排序。