【问题标题】:efficient mySQL fulltext index高效的 mySQL 全文索引
【发布时间】:2018-03-17 14:32:40
【问题描述】:

我希望将游戏结果存储在表格中。每轮将由 2-10 名玩家进行。每个玩家将得分在 1-5 分之间。我需要一种有效的方法来检索给定玩家/分数范围的所有回合。例如:

select all rounds where Hamburger14 scored 5
select all rounds where Cheese3 scored 1
select all rounds where Hotdog99 scored 4

我的第一个想法是使用全文索引的 varchar 字段“player_score”并像这样填充它:

player1:0-player2:3-player3.1

如果我想要所有玩家 1 得 5 分的回合,我会这样做:

select * from rounds where match(player_score) against("player1.5")

如果玩家池保持较小并且分数只有 1-5,这似乎可行,尽管我可能需要弄乱默认的 mySQL 停止列表或使用 HEX 值作为分数等。

但是这似乎非常丑陋。有什么建议吗?

可选:如果将来我想检索给定玩家和 SCORE RANGE 的回合(例如,playerX 得分为 3 或更多的所有回合),如何实现?

【问题讨论】:

    标签: mysql indexing full-text-indexing


    【解决方案1】:

    全文——没有。

    CREATE TABLE Rounds (
        round_num SMALLINT UNSIGNED NOT NULL,
        player VARCHAR(55) NOT NULL,
        score TINYINT UNSIGNED NOT NULL,
        PRIMARY KEY(round_num, player),
        INDEX(player, score)
    );
    

    那就做吧

    SELECT * FROM Rounds
         WHERE player = "player1"
           AND score = 5;
    

    要获取有关回合的其余信息:

    SELECT r.*
         FROM ( SELECT round_num FROM Rounds
                   WHERE player = "player1"
                     AND score = 5 ) AS x
         JOIN Rounds AS r USING(round_num);
    

    【讨论】:

    • 除了参与者和分数之外,我还想保存完整的回合成绩单(需要很多字段) - 你是说这应该完全放在另一个表中?我最初避免使用这种方法是因为冗余和需要大连接。
    • @ReallyMadeMeThink - 我添加了一个查询,可能会得到你想要的。
    • 那行得通。它看起来并不优雅,因为整个“rounds”表是多余的,并且基本上仅用作索引。我希望有一种简单的方法来索引“x 在不超过 10 个的集合中的存在”,但它看起来并不乐观。
    • @ReallyMadeMeThink - 我想我需要查看一个示例数据集来理解您的“不优雅”批评。
    • 考虑存储完整的扑克手。每手牌都有参与者,但也有起始筹码、座位位置、下注动作、翻牌、转牌、河牌、摊牌以及谁赢了。如果我想查询特定玩家在某些场合的倾向,我首先想将搜索范围缩小到该玩家玩过的牌,这就是为什么我要索引这个属性,但之后我很可能会缩小搜索范围在其他领域进一步......
    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2023-03-13
    • 2015-08-14
    • 1970-01-01
    • 2014-07-23
    • 2017-11-11
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多