【问题标题】:MySql, SELECT * FROM with Indexed columnsMySql,SELECT * FROM 与索引列
【发布时间】:2016-02-13 18:55:00
【问题描述】:

我正在使用 MySql 中的一个表,该表有一个名为“serial”的 int 索引列。该表有大约 200 万行。

如果我以这种方式对该列应用 select 语句:

 SELECT serial FROM Table WHERE Serial=12345

这会在

但是,如果我在同一个表中使用 SELECT * 查询,则此查询需要 大约 78 秒...

我知道将索引应用于表中的所有列没有用,如果我需要从特定序列中获取所有列,如何优化/最小化查询响应时间?

 SELECT * FROM Table WHERE serial= 12345

EXPLAIN 的结果:

选择序列号:

1 SIMPLE tableName index idx_tablename_serial 5 6686620 使用索引

选择 *:

1 SIMPLE agsensepivotreadings ALL(空值)6686620

请,任何建议或指导将不胜感激。

【问题讨论】:

  • 很少需要选择表中的每个字段。
  • 假设有 20 列,我需要返回 18 列,这些是每 5 分钟从设备读取的属性。
  • 你能发布两个查询的解释结果吗?
  • 第一个查询很快,因为根本不需要读取表本身,因为所需的全部信息都在索引中。至于第二个查询:有多少条记录共用一个序号? (最小值、最大值、平均值、典型值。)
  • 这张表有可能是一个视图吗?

标签: mysql sql database performance indexing


【解决方案1】:

即使将需要阅读的栏数限制为少数人也会有所帮助。只需进一步限制它,如果索引更多列有助于继续进行,但它们需要在 WHERE 子句中使用。

【讨论】:

    【解决方案2】:

    这些列不太可能导致问题。如果一个(或多个)列是非常非常大的对象,则可能会发生这种情况。要达到 78 秒,您需要考虑许多兆字节或千兆字节,尽管在许多环境中即使 1 GB 也可能不会花费那么长时间。

    索引与非索引的使用很容易解释。第一个查询被索引覆盖,因此不需要原始数据页。第二个查询没有被索引覆盖。因为选择了这么多行,所以可能需要读取所有数据,才能找到匹配的行。这是防止抖动的优化。它可以解释发生了什么,尽管将表加载到内存中需要 78 秒似乎很长——除非行很宽。

    另一种可能是其他操作正在锁定表。在许多环境中,这很可能是罪魁祸首。

    最后,如果查询稍有不同(例如有一个 order by 或用单引号括起来的常量),那么这可能会造成一些差异。

    我会检查explain 看看发生了什么。即使搜索包含几百万行的表也不应该花费 78 秒。

    【讨论】:

      【解决方案3】:

      您的问题有部分答案。

      https://stackoverflow.com/a/3211164/2957840

      而且,也许你应该考虑对你的表进行分区: https://dev.mysql.com/doc/refman/5.7/en/partitioning.html

      【讨论】:

        【解决方案4】:

        如果SerialVARCHAR,则您的输入有问题。在“123456”周围加上引号。

        PARTITION 不会帮助该查询。

        如果您需要进一步讨论,请提供SHOW CREATE TABLE

        【讨论】:

          猜你喜欢
          • 2014-01-03
          • 1970-01-01
          • 1970-01-01
          • 2014-06-17
          • 1970-01-01
          • 2011-03-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多