java - h2database 的排序速度很慢

标签 java sql performance h2

我有一个 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 毫秒。但当通过 to desc 更改订单时,情况发生变化,查询大约需要 8-10 秒。

无论如何,是否有更快下单的解决方案?

谢谢

最佳答案

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

CREATE INDEX IDX_TO ON DB.TEST(TO);  

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

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

关于java - h2database 的排序速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7132667/

相关文章:

java - 如何终止包装函数的线程? [复制]

java - 尝试使用 logback 打印堆栈跟踪,但堆栈跟踪未打印

sql - 关系索引数据库包装器

sql - 查找以 2 开头且长度至少为 3 个字符的任何值

mysql - SQL查询: Group Concat Children Elements With Parent

sql-server - 基于SQL的加密性能

java - 打开的文件太多<如何查找导致泄漏的java文件>

performance - 如何分析 Oracle 存储过程的端到端性能

javascript - 在 Node 中处理大量数据的最快方法

java - 独立集群中的 Spark 动态分配使我的应用程序失败