我有一个包含 210 列的宽表(这可能是一个糟糕的结构,但每次都需要所有数据)。主键有一个主类型索引。
现在,当我没有任何条件地从我的单个表中选择 * 时。它会导致全表扫描。
它说: 未找到该表的可用索引
这也意味着搜索范围太广,索引毫无用处。
我该怎么做才能避免这种全表扫描?
注意:我每次都需要所有信息,因此破坏表格会导致性能下降..!
我是 MySQL 新手。因此,我们将不胜感激。谢谢..!
最佳答案
请参阅以下链接了解更多详情
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 强制索引 (index_for_column) 其中 t1.col_name=t2.col_name;
关于mysql - 无条件全选时昂贵的全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57286511/