具有大量列的MySQL JPA查询的运行速度比预期的慢得多

时间:2019-01-14 09:57:39

标签: java mysql jpa eclipselink jpql

我有查询,当我通过JPA执行该查询时运行缓慢,普通的mysql调用需要〜0.05秒,通过JPA需要3秒钟以上,我不明白为什么。 记录器显示它有很长的ObjectBuildingTime:

    number of objects=953,
total time=2673045667,
local time=2673045667,
profiling time=1273000,
Timer:Logging=616666,
Timer:ObjectBuilding=2317873662,
Timer:SqlPrepare=16289334,
Timer:Register=149633998,
Timer:StatementExecute=82975667,
Timer:Caching=82966350,
Timer:RowFetch=223775000,
time/object=2804874,

这是什么意思,我该如何加快速度? 我的查询如下:

SELECT * FROM TESTENTITY t0, INNERTESTENTITY t1 WHERE (((t0.TIMESTAMPCREATION BETWEEN ? AND ?) AND (t0.DATA_TYPE IS NOT NULL)) AND ((t1.ID = t0.ID)))

Innertestentity具有许多属性(约40个)和两个指向其他较小对象的外键。它是Testentity的映射超类。这可能是原因吗? 预先感谢您的帮助。

编辑: 我的实体看起来像

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "DATA_TYPE")
public class TestEntity{
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
    @JoinColumn(name = "Employee_ID")
    private EmployeeEntity employeeEntity;

@Entity
@MappedSuperclass
@DiscriminatorValue("SURVEYDATA")
public class innertestEntity extents TestEntity{
    private List<Integer> counts;
    @ElementCollection
    @MapKeyColumn(name = "statename")
    @Column(name = "value")
    @CollectionTable(name = "states")
    private List<Integer> states;
    private List<String> namelist;

1 个答案:

答案 0 :(得分:0)

尝试在日志中打开SQL查询调试,以查看它是否在application.properties中告诉您一些有趣的事情:

org.hibernate.SQL=DEBUG

您还可以尝试在MySQL配置文件(可能是/etc/my.cnf)中打开MySQL的慢速查询日志,这可能也很有帮助:

slow-query-log                  = 1
slow-query-log-file             = /var/lib/mysql/mysql-slow.log

我怀疑问题可能是其中某些其他对象(例如EmployeeEntity)正在加载(如果您的代码正在访问这些字段,则可能是这种情况)。在这些日志和您的代码之间,我想您会看到是否正在访问和加载更多内容。