簡體   English   中英

MySQL JPQL查詢性能問題

[英]MySQL JPQL query performance issue

我正在構建一個我打算成為一個持久在線世界的游戲(例如MMO,但可能不是大量的玩家。)我正在通過僅創建一個2D的“平鋪”網格來制作游戲地圖。 我已經將磁貼持久保存到數據庫中了,並且已經設置了網頁UI(通過Vaadin),以便可以正常查看它們。 到目前為止,我最常在20x20的網格中查看它們。

到現在為止,它似乎進展順利。 我可以保留幾套10,000張磁貼,然后滾動查看它們並重新顯示磁貼幾乎是瞬時的。 但是,今天,我決定保留一堆切片(准確地說是633,460),以查看數據庫中更實際的切片數量是什么樣子。 現在,我在地圖上滾動時遇到了一些重大的性能問題,因為我的MySQL數據庫似乎很難處理那么多圖塊。

我正在使用Hibernate支持的JPA 2.0。 即使直接進入數據庫並運行SQL查詢,響應時間也非常慢。

SELECT * FROM game.landtile WHERE xcoor < 999999061 AND xcoor >  999999040
AND ycoor > 1000000140 AND ycoor < 1000000161;

我只是運行了該查詢以獲取400個地塊,因此它的持續時間為3.5秒,而直接在MySQL中的獲取時間為7.25秒! 如果我第二次運行相同的查詢,則其持續時間為0.5秒,提取時間為0.1秒。 我可以忍受500毫秒,而我不能忍受7,000。

我的實體名稱如下:

@Entity
@Table(name = "LandTile", uniqueConstraints = {@UniqueConstraint(columnNames={"XCoor", "YCoor"})})
public class LandTile extends AbstractMapValues implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "LandTileId")
    private String landTileId;

    @Column(name = "XCoor")
    @Index(name = "XCoordinateIndex")
    @Range(min = 0, max = MAX_MAP_INT)
    private int xCoor;


    @Column(name = "YCoor")
    @Index(name = "YCoordinateIndex")
    @Range(min = 0, max = MAX_MAP_INT)
    private int yCoor;

    @OneToOne(cascade = CascadeType.ALL)
    private Building building;

    @OneToOne(cascade = CascadeType.ALL)
    private Road road;

    private boolean river;

    @OneToMany(mappedBy="expeditionLocationLandTile")
    private Set<Expedition> expeditionsAtThisLocation;

    @ManyToMany(
            mappedBy = "discoveredLandTiles",
            targetEntity = Player.class
        )

    private Set<Player> playersThatHaveDiscovered;

    @ManyToMany(
            mappedBy = "routeListOfLandTiles",
            targetEntity = Expedition.class
        )
    private List<Expedition> expeditionRouteThisIsPartOf;

    @ManyToOne
    @JoinColumn(name="FiefdomOfCapitalCity", unique=true)
    private Fiefdom fiefdomOfCapitalCity;

    @ManyToOne
    @JoinColumn(name="ActualOwningFiefdomId", unique=true)
    private Fiefdom actualOwningFiefdom;

    @ManyToOne
    @JoinColumn(name="DefaultOwningFiefdomId", unique=true)
    private Fiefdom defaultOwningFiefdom;

還有另外18個簡單的int列,我沒有在這里列出。

所以基本上我希望你們能幫助我弄清楚我的選擇。 如您所見,Landtile與其他模型之間存在許多關系,對於這樣的游戲,整個數據集本身是高度相關的,這就是為什么我首先使用SQL數據庫的原因。 但是現在我擔心性能太差了,以至於我應該停止開發新功能,並重做我的整個DAO層(希望只是...)以使用NoSQL數據庫並處理與我在Java中的所有關系。

看起來MongoDB內置了對2d網格的支持:

http://blog.codecentric.de/zh/2012/02/spring-data-mongodb-geospatial-queries/

我當時計划可能將游戲托管在Amazon上,並使用Amazon Elasti-cache。 我的游戲地圖數據是否有可能大部分停留在第二級緩存中(通過休眠),因此我不會有這種可怕的表現? 我真的認為,我會遇到的關於MySQL的唯一真正的性能問題就是在愚蠢的地圖上滾動!

我的數據是空間數據,而MySQL的InnoDB引擎不支持空間索引。 MyISAM引擎可以,但是不支持事務或外鍵。 參見MySQL文檔

我決定不使用犧牲事務和外鍵的方式,而是決定使用支持復雜關系,事務和外鍵的數據庫,因此我將整個項目切換為使用Neo4j圖形數據庫

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM