我有一个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 DB
。TEST
ORDER BY id
ASC LIMIT 50 - 它的执行时间大约为3-4毫秒。但是当按顺序改变顺序时,情况就会发生变化,查询大约需要8-10秒。
无论如何解决方案要更快地下订单?
由于
答案 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进行排序。