我有关于数据性能的问题
时间值在我的 Spring Boot 应用程序中存储得一样长。
当我检索多个数据时,我使用 Date_Format FROM_UNIXTIME 转换时间,如下所示
@Query("SELECT new today.feeling.dto.response.emotion.EmotionMonthlyReportQuery(" +
"s.id, " +
"s.studentId, " +
"s.name, " +
"CAST(DATE_FORMAT(FROM_UNIXTIME(e.emotionTime / 1000, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d') AS string) AS emotion_date, " +
"CAST(SUM(CASE WHEN e.emotionType = 1 THEN e.emotionLevel ELSE 0 END) / COUNT(CASE WHEN e.emotionType = 1 THEN 1 END) AS FLOAT), " +
"CAST(SUM(CASE WHEN e.emotionType = 2 THEN e.emotionLevel ELSE 0 END) / COUNT(CASE WHEN e.emotionType = 2 THEN 1 END) AS FLOAT), " +
"CAST(SUM(CASE WHEN e.emotionType = 3 THEN e.emotionLevel ELSE 0 END) / COUNT(CASE WHEN e.emotionType = 3 THEN 1 END) AS FLOAT), " +
"CAST(SUM(CASE WHEN e.emotionType = 4 THEN e.emotionLevel ELSE 0 END) / COUNT(CASE WHEN e.emotionType = 4 THEN 1 END) AS FLOAT)) " +
"FROM Emotion e " +
"JOIN Student s ON s.id = e.student.id " +
"WHERE s.isRemoved = FALSE AND s.classroom.id = :classroomId AND s.year = :year AND e.emotionTime BETWEEN :startDate AND :endDate " +
"GROUP BY s.id, emotion_date " +
"ORDER BY s.studentId, emotion_date")
List<EmotionMonthlyReportQuery> getEmotionMonthlyReportList(@Param("classroomId") Long classroomId,
@Param("year") Integer year,
@Param("startDate") long startDate,
@Param("endDate") long endDate);
直接在DB中转换时间好还是在服务层转换时间好?
我想知道哪种方法在性能或代码分离方面更好
使用函数将数据转换为字段会导致索引失败吗?当然如果数据量比较小的话应该没问题。 如果在检测后在Service层代码中进行转换(比如使用Redis缓存来提高性能),性能扩展性会好很多。 你写的SQL,我看了一下,可能会引起临时表,甚至文件排序哦。恐怕性能会出现大问题。 总之,在不考虑性能的前提下,使用MySQL的功能还是相当方便的。