mysql - 无条件全选时昂贵的全表扫描

标签 mysql query-optimization mysql-workbench

我有一个包含 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/

相关文章:

mysql - 在项目数据库中创建模型期间 Sequelize CLI 错误

MySQL:如何访问在 Ubuntu 计算机上的 docker 实例内运行的 MySQL 数据库

mysql - 如何创建复合键?

php - 如何在 Codeigniter 中对始终位于顶部的特定/某些行的表进行排序?

php - 一个查询中两个表的 ORDER BY 结果

mysql - 优化 MySQL 脚本

Mysql "Using temporary"但此查询中没有匹配的官方原因

mysql - 根据多对多表中的 Count() 更新表

mysql - 创建外键需要MySQL语句中包含ENGINE关键字

sql - Oracle 对 View 使用提示索引并强制其到基表