我有一个具有210列的宽表(这可能是一个不好的结构,但是每次都需要所有数据)。主键有一个主类型索引。
现在,当我从单表中选择*时,没有任何条件。这样会进行全表扫描。
它表示以下内容: 找不到该表的可用索引
这也意味着搜索范围如此之广,以至于索引无用。
如何避免这种全表扫描?
注意:每次我都需要所有信息,因此破坏表将导致性能下降..!
我是MySQL的新手。因此,将不胜感激。谢谢..!
答案 0 :(得分:1)
有关更多详细信息,请参见下面的链接
https://dev.mysql.com/doc/refman/8.0/en/table-scan-avoidance.html
下面是全表扫描的原因
表是如此之小,以至于执行表扫描要比打扰键查找要快得多。对于少于10行且行长较短的表,这很常见。
在ON或WHERE子句中,对于索引列没有可用的限制。
您正在将索引列与常量值进行比较,MySQL计算得出(基于索引树),常量覆盖了表的太大部分,并且表扫描会更快
您正在通过另一列使用基数较低的键(许多行与键值匹配)。在这种情况下,MySQL假定通过使用键,它可能会执行许多键查找,并且表扫描会更快。
为避免全表扫描,请在下面使用:
对扫描的表使用FORCE INDEX告诉MySQL与使用给定索引相比,表扫描非常昂贵:
例如SELECT * FROM t1,t2 FORCE INDEX(index_for_column) 在哪里t1.col_name = t2.col_name;