【问题标题】:need to create an efficient index for a table with more than 2 million records需要为超过 200 万条记录的表创建高效索引
【发布时间】:2020-06-22 15:29:53
【问题描述】:

我需要优化的查询如下:

 SELECT  field0.entity_type AS entity_type,
                field0.entity_id AS entity_id, field0.revision_id AS revision_id,
                field0.bundle AS bundle
            FROM  field field0
            INNER JOIN  node node  ON node.nid = field0.entity_id
            WHERE  (field0.field_value = '23ad')
              AND  (field0.deleted = '0')
              AND  (node.status = '1')
              AND  (field0.entity_type = 'node')
              AND  (field0.bundle = 'title')

查询的以下部分始终相同:

AND  (field0.deleted = '0')
          AND  (node.status = '1')
          AND  (field0.entity_type = 'node')
          AND  (field0.bundle = 'title')

唯一改变的是:

WHERE  (field0.field_value = '?')

按照上述查询的解释结果:

[解释选择结果][1]

以及来自字段查询的 SHOW INDEXES 的结果:

[表名字段中现有索引的结果][2]

我不仅有这么大的表,而且由于这个数据库属于一个drupal 7站点,所以表比较多,所以性能真的很慢。 你建议我做哪个索引?我应该如何处理现有的索引?

SHOW VARIABLES LIKE "%version%"; 返回 5.7.29

[从节点显示索引的结果;][3]

[DESCRIBE 节点的结果;][4]

[DESCRIBE 字段的结果;][5]

我测试了下面的答案,它与我的第一次试验不同: (bundle、entity_type、deleted、field_tl_uuid_value、entity_id、revision_id)。两者都给我结果,我应该选择哪个,为什么? [1]:https://i.stack.imgur.com/lfcn6.png [2]:https://i.stack.imgur.com/qXsPt.png [3]:https://i.stack.imgur.com/5w9lD.png [4]:https://i.stack.imgur.com/fTRDY.png [5]:https://i.stack.imgur.com/KvRVX.png

【问题讨论】:

  • 每张表的主键是什么?这些表还有哪些其他键或索引?
  • 我添加了一些可能有帮助的信息

标签: mysql drupal


【解决方案1】:

您的查询将受益于以下索引:

create index on field (bundle, entity_type, deleted, field_value);

【讨论】:

  • 我测试了上面的答案,它与我的第一次试验不同:(bundle,entity_type,deleted,field_tl_uuid_value,entity_id,revision_id)。两者都给我结果,我应该选择哪个,为什么?
  • @jageyaj820 作为一般规则,您添加到表中的每个索引在插入、更新和删除时都有成本,保持所需的最少索引数量(我会避免避免 10 个索引每桌)。现在,两个索引都包含“过滤列”,因此它们应该提供相似的结果。我会选择最小的一个(更少的列,更小的列),因为它对引擎来说更便宜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-08-10
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多