h2 MySQL 速度_H2数据库:虽然使用索引,但查询速度慢

使用H2 1.3.176.

1)表定义:

CREATE TABLE TEST(ID BIGINT PRIMARY KEY, ACCOUNT BIGINT, TXID BIGINT);

2)将值插入表中:

INSERT INTO TEST SELECT X, RAND()*100, X FROM SYSTEM_RANGE(1, 1000000)

3)创建用于我的查询的索引:

CREATE Unique INDEX IDX_TEST_ACCOUNT_TXID ON `test` (account, txId DESC);

4)执行以下查询:

explain analyze

select txid from test where account=22 AND txid<9999999 order by txid desc limit 25

我得到以下执行计划:

SELECT

TXID

FROM PUBLIC.TEST

/* PUBLIC.IDX_TEST_ACCOUNT_TXID: ACCOUNT = 22

AND TXID < 9999999

*/

/* scanCount: 9867 */

WHERE (ACCOUNT = 22)

AND (TXID < 9999999)

ORDER BY 1 DESC

LIMIT 25

/*

TEST.IDX_TEST_ACCOUNT_TXID read: 103

*/

问题:为什么H2需要扫描整个索引?我期待扫描计数为25,因为索引中的txid已经是降序,所以一旦H2在索引的account = 22分支中,它应该能够读取接下来的25个条目.如果表中有数百万个条目,这将导致查询速度变慢.即使H2必须在索引中搜索第一个匹配条目,我也希望这是一个O(log(N))算法,而不是扫描.

如果我在没有列帐户的情况下做同样的事情(意味着表只包含id和txid),那么txid上的降序索引确实会导致扫描计数为25(使用查询“select txid from test where txid< 9999999 order通过txid desc“).

为什么附加列会破坏执行计划?

也许我不明白索引是如何工作的.有没有更好的方法为我的查询定义索引?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值