【问题标题】:Creating index on mysql table在mysql表上创建索引
【发布时间】:2013-06-02 22:29:23
【问题描述】:

我在 mysql 数据库中有一个名为 data 的表。该表非常大,大约有 50 万条记录,这个数字将增长到 100 万条。每条记录由大约 50 列组成,其中大部分包含 varchars。

data 表的使用非常频繁。实际上,大多数查询都访问该表。大约 50 个用户同时读取和写入数据。系统负载很高,用户上传和检查他们的数据,因此最多可以停止一两个小时。

经过一番研究。我发现几乎所有具有“where”子句的选择查询都使用表中的四个字段之一。这些字段是:isActive、country、state、city - 都是 int 格式。 where 可以是

    where isActive = {0|1}

    where isActive = {0|1} and {country|state|city} = {someIntValue}

    where {country|state|city} = {someIntValue}

最后一件事是该表除了主 id 之外没有任何索引。

在表格增长到当前大小后,我遇到了一些性能问题。

所以,我的问题是,如果我在 isActive、国家、州和城市列上创建索引,性能会提高吗?

UPD:我刚刚在其中一个字段上创建了一个索引,哇!查询正在立即执行。谢谢各位。

【问题讨论】:

  • 是的 - 试试吧 - 你不会丢失任何数据。仅使用值 0 或 1 时可以使用 tinyint。
  • 是所有字段的复杂单一索引还是每个字段的单独索引?据我了解,创建索引会导致表重新创建,我不想冒险。
  • 餐桌娱乐?创建或删除索引不会影响任何数据或表本身。
  • 要回答您的问题,我们需要 4 列中每一列的当前和目标基数。 (现在是不同的总行数/总行数,以及当表有 1M 条记录时您认为的估计值)。
  • 您是否有检查所有 3(或 4)列的查询,例如:where (country = X and state = Y and city = Z)

标签: mysql performance indexing


【解决方案1】:

我认为索引 isActive 字段不是一个好主意,因为它会在添加/更新/删除时导致索引开销,但它只会在读取时将数据分成两块(1 和 0)这不会有什么帮助。

编辑:发现这个来解释上面的观点: Is there any performance gain in indexing a boolean field?

对于其他树列,我建议您在大多数用户离线时(在晚上或午餐时间)做一个基准测试,看看它如何影响性能,但我认为它真的很有帮助,而且没有很多缺点。

编辑:ypercube 指出了一些有趣的用例,其中我关于索引布尔字段的答案不相关,请检查 cmets。

【讨论】:

  • 索引isActive 也可能会有所帮助。如果存在不平衡,比如只有 1% 的人有 isActive=1,那么具有这种条件的查询将使用索引,并且可能比使用全表扫描更有效。
  • 索引对于WHERE isActive=X ... LIMIT (Y) 类型的查询也很有用,其中X 可以是0 或1,Y 不大。
  • 加载所有数据后,isActive 字段将因业务逻辑而变得无用。
【解决方案2】:

是的,为这些列中的每个创建索引会对您有所帮助。

考虑并在每个一词下划线。 我建议每个索引都有一个单独的索引。原因是不同的列组合并存。

【讨论】:

    【解决方案3】:

    是的,当然。 如果您也将选定的附加字段包含到每个索引中,您可能会看到更好的结果。请注意列顺序... 但首先,请确保您不要将 myisam 引擎用于具有许多写入的大表!例如切换到 innodb。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 2013-11-27
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2015-08-14
      相关资源
      最近更新 更多