【问题标题】:MySQL self join performance: fact or just bad indexing?MySQL 自连接性能:事实还是索引不好?
【发布时间】:2017-06-27 00:50:49
【问题描述】:

例如:我有一个数据库来检测访问者(机器人等),由于不是每个访问者都有相同数量的“凭据”,所以我制作了一个“动态”表,如下所示:参见小提琴:http://sqlfiddle.com/#!9/ca4c8/1 (简化版)。

这将返回我用来收集有关每个配置文件(在另一个数据库中)的信息的配置文件 ID。根据配置文件类型,我使用不同的nameclause (name='something')(ei:主机名、ipAddr、userAgent、HumanId 等)查询表。

我不是 SQL 专家,但我熟悉索引、约束、主键、唯一键、外键等。根据我从这些搜索结果中看到的信息:

他们中的大多数人都有cmets关于自联接性能不佳的问题,但答案往往是针对缺少索引的原因。

所以最后一个问题是:假设所有内容都已正确索引,自加入表是否会使其更容易出现不良性能?


附带说明,有关表格的更多信息:可能与问题无关,但适合我的特定情况:

  • 列标志用于标记要删除的记录,因为我从 php 使用的用户没有对该数据库的 DELETE 权限。抱歉,安全比性能更重要
  • 我添加了与从用户代理获得的信息一起使用的“类型”。 (即:如果有任何东西(至少看起来是)机器人,我们将只搜索类型 5000。
  • 不幸的是,列“名称”是在主键中索引的 varchar(带有配置文件和类型)。
  • 我尝试在 SELECT 查询中使用尽可能多的 INT 和过滤 (WHERE) 来减少最终的性能损失(如果这很重要的话)
  • 如果需要,我愿意研究和调整这件事,除非有 mysql 高背景的人告诉我这样做真的不是一件好事。

这是我正在开发的一个大型项目,因此我目前无法使用数百万条记录对其进行测试,但我想知道随着它的增长,性能是否会成为问题。任何输入、链接、参考、文档或测试程序(可能在 cmets 中)将不胜感激。

【问题讨论】:

    标签: mysql performance join indexing entity-attribute-value


    【解决方案1】:

    自联接与联接两个不同的表没有什么不同。优化器将选择一个“表”,通常基于WHERE,然后对另一个进行嵌套循环连接。在您的情况下,您通过LEFT 暗示它应该只以一种方式工作。 (优化器将忽略它认为不需要它的 if

    你的钥匙是为那个小提琴找到的。

    真正的问题是“实体-属性-值”,这是一种在表格中布置数据的混乱方式。您的查询似乎是说“找到一个(限制 1)profile(实体),它具有一对属性(名称 = Googlebot AND addr = ...)。

    拥有两列(名称和地址)和一个“复合”INDEX(name, addr) 会更容易、更快。

    我建议对 common “属性”执行此操作,然后将其余部分放入带有 JSON 字符串的单个列中。见here

    【讨论】:

    • 感谢您提供的文档,我正在寻找的那种输入。我没有使用两个列的原因是不同类型的配置文件需要不同数量的属性。 (ei: apis 需要 4 : name, addr, appid, token)。
    • “自联接与联接两个不同的表没有什么不同。”似乎是一个直截了当的答案,看着你的个人资料,我很想把它标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 2020-05-14
    • 2011-09-06
    • 2011-07-23
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2012-07-01
    相关资源
    最近更新 更多