在我的数据库IM_0609中,OrientDB版本2.0.8是MARKS类:
Hibernate: alter table Category drop foreign key FK_p6elut499cl32in8b8j8sy2n4
Hibernate: alter table Product drop foreign key FK_b7afq93qsn7aoydaftixggf14
Hibernate: drop table if exists Category
Hibernate: drop table if exists Product
Hibernate: create table Category (id bigint not null auto_increment, name varchar(255), parent_id bigint, primary key (id))
Hibernate: create table Product (id bigint not null auto_increment, dataTableJson varchar(255), jargonCode varchar(255), order integer not null, category_id bigint, primary key (id))
Hibernate: alter table Category add constraint FK_p6elut499cl32in8b8j8sy2n4 foreign key (parent_id) references Category (id)
Hibernate: alter table Product add constraint FK_b7afq93qsn7aoydaftixggf14 foreign key (category_id) references Category (id)
在42898973行的MARKS类中,我创建了索引如下:
CALIBRATION_DATE:date.
DEVICE_MARK:string
DEVICE_NAME:string
END_MARK_NUM:decimal
MARK_NUM:decimal
PERIOD:decimal
SERIAL_NUM:string
我快速运行以下查询:
CREATE INDEX MARK_NUM_END_MARK_NUM on MARKS(MARK_NUM,END_MARK_NUM) NOTUNIQUE
找到1件物品。查询以0.097秒(s)执行。
这需要创建索引或更新查询的请求:
select * from MARKS where (MARK_NUM =84278511 AND END_MARK_NUM
=84278511 AND END_MARK_NUM IS NOT NULL)
服务器显示以下消息:
select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL
问:为什么会运行第二个查询?
答案 0 :(得分:1)
如果您没有特别说明,那么Orientdb不会保留空值的索引。为此,您必须按如下方式设置元数据标签:
CREATE INDEX addresses ON Employee (address) notunique METADATA {ignoreNullValues : false}
但是你的第一个查询
select * from MARKS where (MARK_NUM =84278511 AND END_MARK_NUM =84278511 AND END_MARK_NUM IS NOT NULL)
表示END_MARK_NUM = 84278511的特定值,因此它可以使用索引并限制记录读数< 50000
但是你的第二个问题
select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL
没有说明END_MARK_NUM的具体值,因此无法使用您的索引。因此,记录读取的数量增加,并且提示"尝试减少orientdb必须执行的记录读取次数"
编辑:ignoreNullValues功能似乎存在错误。 (https://github.com/orientechnologies/orientdb/issues/4508)
答案 1 :(得分:0)
好像你只是有太多的记录匹配查询。另外,你的意思是在第一个查询中是'IS NOT NULL',而在第二个查询中是'IS NULL'吗?
尝试使用限制
select * from MARKS where MARK_NUM =84278511 AND END_MARK_NUM IS NULL LIMIT 10
答案 2 :(得分:0)
此查询立即运行:
select * from index:MARKS.MARK_NUM_END_MARK_NUM where key=[84278511,NULL]
问:但我如何获得班级MARKS的字段?