【问题标题】:How to index to avoid full table scan?如何索引以避免全表扫描?
【发布时间】:2012-09-27 06:18:17
【问题描述】:

如何索引以下查询以避免全表扫描?

explain SELECT fld1, fld2 FROM tablename WHERE IdReceived > 0; 

+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+
|  1 | SIMPLE      | tablename        | ALL  |IdReceived _idx| NULL | NULL    | NULL | 99617 | Using where | 
+----+-------------+------------------+------+---------------+------+---------+------+-------+-------------+

我已将查询修改如下,然后我还可以看到行 id2 (UNION) 正在进行全表扫描。

explain SELECT fld1,fld2 FROM tablename WHERE IdReceived=1 UNION SELECT fld1,fld2 FROM tablename WHERE IdReceived>=1;
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+
| id | select_type  | table            | type | possible_keys | key          | key_len | ref   | rows  | Extra       |
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+
|  1 | PRIMARY      | tablename | ref  | IdReceived _idx  | IdReceived _idx | 4       | const |  8865 |             | 
|  2 | UNION        | tablename | ALL  | IdReceived _idx  | NULL         | NULL    | NULL  | 99617 | Using where | 
| NULL | UNION RESULT | <union1,2>       | ALL  | NULL          | NULL         | NULL    | NULL  |  NULL |             | 
+----+--------------+------------------+------+---------------+--------------+---------+-------+-------+-------------+

【问题讨论】:

  • 尝试强制统计更新。它具有适当的索引。查询规划器必须确定最好不要使用它。 (另外,IdRecieved 列中的值分布是怎样的?)

标签: mysql optimization indexing


【解决方案1】:

由于您将索引列与常量值进行比较,请尽量避免这种情况。

参考这里:http://dev.mysql.com/doc/refman/5.0/en/where-optimizations.html

我还建议在 fld1,fld2 上使用非聚集索引,以使此查询执行得更快

【讨论】:

  • 那句话没有意义; ifwhy 限定一个常量值可能会导致 不使用索引
  • "由于您正在将索引列与常量值进行比较,因此表 sacn 必须存在。"表示所有带有常量的查询都将忽略索引
  • 哪一部分?请务必包含外部资源的摘录/引用/准确摘要。
  • 这并不意味着你认为它是什么。那里没有说“恒定折叠力表扫描”——因为那会很愚蠢。
  • SELECT fld1,fld2 FROM tablename WHERE IdReceived=1 UNION SELECT fld1,fld2 FROM tablename FORCE INDEX(IdReceived _idx) WHERE IdReceived>=1;这将解决问题,但是在频繁触发查询时使用 FORCE INDEX 关键字有什么缺点吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 2012-04-21
  • 1970-01-01
  • 2019-07-17
  • 2015-12-04
  • 2014-02-07
相关资源
最近更新 更多