【问题标题】:MySQL - How should i index this table?MySQL - 我应该如何索引这个表?
【发布时间】:2018-12-28 11:09:33
【问题描述】:

我有一个存储用户电视节目库的表,我想改进它

该表包含以下列:

  • USER_ID
  • SHOW_ID
  • STATUS
  • PROGRESS |观看的最后一集
  • IS_FAVORITE
  • RATING

我有以下索引:

  • USER_ID & SHOW_ID |初级
  • USER_ID |需要外键
  • SHOW_ID |需要外键
  • USER_ID & STATUS
  • USER_ID & IS_FAVORITE
  • SHOW_ID & STATUS
  • SHOW_ID & IS_FAVORITE

我有大约 20M 行,数据权重大约 750MB,索引权重大约 2GB,总共大约 2.75GB 我认为索引太多了,但也许它们确实需要提高性能,我应该这样保留还是应该删除最后 4 个索引,为什么?

【问题讨论】:

  • 这取决于您的查询,您最常运行的查询是什么,如果这些查询正在使用这些索引,则保持原样,否则删除
  • 索引取决于您正在执行的查询。你知道你对这张表最常见的查询吗?
  • 这篇值得一读:use-the-index-luke.com
  • 这两个FK(单列)键是多余的,可以去掉。 FK 将根据需要获取其他索引。

标签: mysql sql indexing group-by query-optimization


【解决方案1】:

与数据相比,您的索引的大小确实看起来相当大。

但是,您的问题的答案在很大程度上取决于您针对此表运行的查询。您应该知道您的查询,因此您可以一一分析它们:如果您发现一个查询没有使用的索引,则删除它。

如果您不知道您的查询,并且您正在运行 MySQL 5.6 或更高版本,您可以使用PERFORMANCE_SCHEMA 访问索引 IO 统计信息(自上次数据库重新启动以来)。这可用于检测未使用的索引,例如:

SELECT 
    object_schema,
    object_name,
    index_name
FROM 
    performance_schema.table_io_waits_summary_by_index_usage 
WHERE
    index_name IS NOT NULL
   AND count_star = 0
ORDER BY object_schema, object_name;

请参阅this discussion 了解更多信息。但是使用此方法时要小心:您可能有一个依赖于古怪索引的月度或季度查询,这可能不会出现在短期分析中。

【讨论】:

  • 当心检测“未使用”的查询—​​—您可能有一个每月需要该古怪索引的删除。删除索引,您将陷入困境。
  • @RickJames:对,感谢您指出,我在回答中添加了警告。无论如何,IMO 最好的选择仍然是知道您运行的是哪个查询,这样您就可以从那里开始您的分析,而不是相反
猜你喜欢
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 2014-08-26
  • 2012-07-28
  • 2011-12-22
  • 1970-01-01
  • 2012-01-12
  • 2013-01-15
相关资源
最近更新 更多