【问题标题】:Mysql indexes weird behaviorMysql 索引奇怪的行为
【发布时间】:2015-07-12 01:19:19
【问题描述】:

我有一个超过 200,000 行和 81 列的表格。我总共有 31 个索引。昨天我在一列上添加了一个新索引。现在,当我在 where 子句中单独使用该列时,结果非常快。但是,一旦我在不同索引列的 where 子句中添加另一个条件,查询就会变慢。例如,如果我有带有索引的列 c1、c2、c3、c4,则所有查询如下:

select c1,c2 from table1 where c1=a and c2=b and c3 = d

速度非常快。但是当我在现有列 c5 上添加新索引时,查询如下:

select c5 from table1 where c5>a

速度很快,但只要我添加新的条件,比如

select c5 from table1 where c5>a and c1=b

查询变慢。当我说慢时,它慢了 15-20 倍。快速查询需要 0.2 秒,慢速查询需要 3-4 秒。

非常需要帮助。谢谢

【问题讨论】:

  • 您尝试过添加composite index 吗?
  • 您可能想研究覆盖索引。
  • 使用EXPLAIN 来分析查询。不要索引所有内容。索引不是您希望事情变得更快的神奇独角兽。始终指定您的数据集大小,无论您是否使用InnoDB,如果是,您的innodb_buffer_pool_size 变量的值是多少。此外,具有 81 列和 31 个索引的东西只会尖叫“请删除我并规范化我以供将来使用”。
  • select c1,c2 from table1 where c1=a and c2=b and c3 = d -- 当您知道c1c2ab 时,您真的选择了它们吗?请不要挥手。创建索引比您想象的要微妙。 this` 查询的最佳索引是 _composite 索引:INDEX(c1,c2,c3)。在 this 情况下,列的顺序无关紧要。此外,给定这个复合索引,INDEX(c1) 是多余的,但 INDEX(c2) 不是。

标签: mysql database indexing


【解决方案1】:

首先你可以使用复合索引(多个字段的索引)

其次,可以查看查询计划为

EXPLAIN SELECT [...]

(当然是使用实际的 select 语句。)

如果可以显示输出

SHOW CREATE TABLE

以及慢查询的解释,我们可以弄清楚该怎么做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    相关资源
    最近更新 更多