varchar上的索引列不起作用

时间:2017-04-21 13:03:19

标签: mysql indexing

我有索引列' unique_identifier'。当我使用索引列获取数据时,不会使用索引获取数据。

npm ERR! node v7.7.4
npm ERR! npm  v4.1.2

npm ERR! "toString()" failed
npm ERR! 
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>

使用&#39;解释扩展&#39;它显示&#39;使用where&#39;而不是使用索引&#39;。这是否意味着数据无法使用索引列获取?以下是解释扩展&#39;的结果。用于选择查询。

    mysql> show index from stock_index_table;
    +-------------------+------------+-------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | Table             | Non_unique | Key_name          | Seq_in_index | Column_name       | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
    +-------------------+------------+-------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
    | stock_index_table |          0 | PRIMARY           |            1 | id                | A         |        4393 |     NULL | NULL   |      | BTREE      |         |               |
    | stock_index_table |          1 | unique_identifier |            1 | unique_identifier | A         |        4393 |     NULL | NULL   |      | BTREE      |         |               |

结果&#39;解释&#39;应该在Extra中看起来像这样。

    mysql> explain extended select id 
       from stock_index_table
       where unique_identifier='Nifty' ;
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+
    | id | select_type | table             | type | possible_keys     | key               | key_len | ref   | rows | filtered | Extra                    |
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+
    |  1 | SIMPLE      | stock_index_table | ref  | unique_identifier | unique_identifier | 52      | const |    1 |   100.00 | Using where; Using index |
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+

2 个答案:

答案 0 :(得分:2)

由查询优化器决定如何获取数据,对于小型表,可能会忽略所有索引。 也可能是您的查询不合适,我们必须能够查看表格并查询是否还有其他事情可以完成。

答案 1 :(得分:1)

请不要通过命名非唯一索引来混淆事物&#34;唯一...&#34;!

EXPLAIN看起来最佳。

&#34;使用索引&#34; (意思是&#34;覆盖&#34;)说只需要索引。

PRIMARY KEY(id),
INDEX(unique_identifier)

并且出现以使用InnoDB。这意味着索引真的是(unique_identifier, id),因为(在InnoDB中),PK会被静默地添加到任何二级索引中。

由于查询只需要这两列,所以&#34;覆盖&#34;。

由于假设该列不止一次出现,因此需要&#34; ref&#34;和&#34;使用where&#34;。 &#34;行= 1&#34;只是因为统计数据推断该列非常接近唯一。

执行将

  • 向下钻取B +树以找到&#34; Nifty&#34;
  • 第一个出现位置
  • 向前扫描(这在InnoDB使用的B +树中很有效),直到找到不是&#34; Nifty&#34;的条目。

因此,它将触及一个额外的行&#39;在索引中。如果是UNIQUE,则不需要提前扫描。