【发布时间】:2017-06-27 00:50:49
【问题描述】:
例如:我有一个数据库来检测访问者(机器人等),由于不是每个访问者都有相同数量的“凭据”,所以我制作了一个“动态”表,如下所示:参见小提琴:http://sqlfiddle.com/#!9/ca4c8/1 (简化版)。
这将返回我用来收集有关每个配置文件(在另一个数据库中)的信息的配置文件 ID。根据配置文件类型,我使用不同的nameclause (name='something')(ei:主机名、ipAddr、userAgent、HumanId 等)查询表。
我不是 SQL 专家,但我熟悉索引、约束、主键、唯一键、外键等。根据我从这些搜索结果中看到的信息:
- Mysql Self-Join Performance
- How to tune self-join table in mysql like this?
- Optimize MySQL self join query
- JOIN Performance Issue MySQL
- MySQL JOIN performance issue
他们中的大多数人都有cmets关于自联接性能不佳的问题,但答案往往是针对缺少索引的原因。
所以最后一个问题是:假设所有内容都已正确索引,自加入表是否会使其更容易出现不良性能?
附带说明,有关表格的更多信息:可能与问题无关,但适合我的特定情况:
- 列标志用于标记要删除的记录,因为我从 php 使用的用户没有对该数据库的 DELETE 权限。抱歉,安全比性能更重要
- 我添加了与从用户代理获得的信息一起使用的“类型”。 (即:如果有任何东西(至少看起来是)机器人,我们将只搜索类型 5000。
- 不幸的是,列“名称”是在主键中索引的 varchar(带有配置文件和类型)。
- 我尝试在 SELECT 查询中使用尽可能多的 INT 和过滤 (WHERE) 来减少最终的性能损失(如果这很重要的话)
- 如果需要,我愿意研究和调整这件事,除非有 mysql 高背景的人告诉我这样做真的不是一件好事。
这是我正在开发的一个大型项目,因此我目前无法使用数百万条记录对其进行测试,但我想知道随着它的增长,性能是否会成为问题。任何输入、链接、参考、文档或测试程序(可能在 cmets 中)将不胜感激。
【问题讨论】:
标签: mysql performance join indexing entity-attribute-value