全选时全表扫描昂贵

时间:2019-07-31 08:34:42

标签: mysql query-optimization mysql-workbench

我有一个具有210列的宽表(这可能是一个不好的结构,但是每次都需要所有数据)。主键有一个主类型索引。

现在,当我从单表中选择*时,没有任何条件。这样会进行全表扫描。

它表示以下内容: 找不到该表的可用索引

这也意味着搜索范围如此之广,以至于索引无用。

如何避免这种全表扫描?

注意:每次我都需要所有信息,因此破坏表将导致性能下降..!

我是MySQL的新手。因此,将不胜感激。谢谢..!

1 个答案:

答案 0 :(得分:1)

有关更多详细信息,请参见下面的链接

https://dev.mysql.com/doc/refman/8.0/en/table-scan-avoidance.html

下面是全表扫描的原因

  • 表是如此之小,以至于执行表扫描要比打扰键查找要快得多。对于少于10行且行长较短的表,这很常见。

  • 在ON或WHERE子句中,对于索引列没有可用的限制。

  • 您正在将索引列与常量值进行比较,MySQL计算得出(基于索引树),常量覆盖了表的太大部分,并且表扫描会更快

  • 您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假定通过使用键,它可能会执行许多键查找,并且表扫描会更快。

为避免全表扫描,请在下面使用:

  • 使用ANALYZE TABLE tbl_name更新扫描表的密钥分布。
  • 对扫描的表使用FORCE INDEX告诉MySQL与使用给定索引相比,表扫描非常昂贵:

    例如SELECT * FROM t1,t2 FORCE INDEX(index_for_column) 在哪里t1.col_name = t2.col_name;