MySQL JPA-запрос с большим количеством столбцов выполняется намного медленнее, чем ожидалось - PullRequest
0 голосов
/ 14 января 2019

У меня есть запрос, который выполняется медленно, когда я выполняю его через 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) и два ForeignKeys для других, более мелких объектов. Это сопоставленный суперкласс от Testentity. Может ли это быть причиной? Заранее спасибо за помощь.

EDIT: Мои сущности выглядят как

@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 голосов
/ 14 января 2019

Попробуйте включить отладку SQL-запросов в журналах, чтобы увидеть, говорит ли он вам что-нибудь интересное, в вашем application.properties:

org.hibernate.SQL=DEBUG

Вы также можете попробовать включить медленный журнал запросов MySQL, который также может быть информативным, в вашем конфигурационном файле MySQL (возможно, /etc/my.cnf):

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

Я подозреваю, что проблема может заключаться в том, что некоторые из этих других объектов (например, EmployeeEntity) загружаются (что может быть в случае, если ваш код обращается к этим полям). Между этими журналами и вашим кодом, я думаю, вы увидите, происходит ли поиск и загрузка чего-то большего.

...