我有索引列' 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 |
+----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+
答案 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;只是因为统计数据推断该列非常接近唯一。
执行将
因此,它将触及一个额外的行&#39;在索引中。如果是UNIQUE
,则不需要提前扫描。