mysql 1=1 1=2_mysql – 搜索满足Column1 <= X <= Column2的行的...

我正在使用MySQL数据库,并具有下表:

CREATE TABLE SomeTable (

PrimaryKeyCol BIGINT(20) NOT NULL,

A BIGINT(20) NOT NULL,

FirstX INT(11) NOT NULL,

LastX INT(11) NOT NULL,

P INT(11) NOT NULL,

Y INT(11) NOT NULL,

Z INT(11) NOT NULL,

B BIGINT(20) DEFAULT NULL,

PRIMARY KEY (PrimaryKeyCol),

UNIQUE KEY FirstLastXPriority_Index (FirstX,LastX,P)

) ENGINE=InnoDB;

该表包含430万行,初始化后永远不会更改.

该表的重要列是FirstX,LastX,Y,Z和P.

如您所见,我在FirstX,LastX和P行上有一个唯一索引.

FirstX和LastX列定义了一系列整数.

我需要在该表上运行的查询为给定的X提取具有FirstX< = X< = LastX的所有行(即,其范围包含输入数X的所有行).

例如,如果表包含行(我只包含相关列):

FirstX LastX P Y Z

------ ------ - --- ---

100000 500000 1 111 222

150000 220000 2 333 444

180000 190000 3 555 666

550000 660000 4 777 888

700000 900000 5 999 111

750000 850000 6 222 333

我需要,例如,包含值185000的行,应返回前3行.

我试过的应该使用索引的查询是:

SELECT P, Y, Z FROM SomeTable WHERE FirstX <= ? AND LastX >= ? LIMIT 10;

即使没有LIMIT,此查询也应该为任何给定的X返回少量记录(小于50).

这个查询是由Java应用程序为120000 X值执行的.令我惊讶的是,它耗时超过10小时(!),每次查询的平均时间为0.3秒.

这是不可接受的,甚至不可接受.它应该快得多.

我检查了一个耗时0.563秒的查询,以确保使用索引.我尝试的查询(与上面的查询相同,使用特定的整数值而不是?)返回2行.

我使用EXPLAIN来了解发生了什么:

id 1

select_type SIMPLE

table SomeTable

type range

possible_keys FirstLastXPriority_Index

key FirstLastXPriority_Index

key_len 4

ref NULL

rows 2104820

Extra Using index condition

正如您所看到的,执行涉及2104820行(几乎占表的行的50%),即使只有2行满足条件,因此检查索引的一半以便仅返回2行.

查询或索引有问题吗?您能否建议对查询或索引进行改进?

编辑:

一些答案建议我为X的多个值批量运行查询.我不能这样做,因为我实时运行此查询,因为输入到达我的应用程序.每次输入X到达时,我必须执行X的查询并对查询的输出执行一些处理.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值