2017-04-21 64 views
0

我有索引列'unique_identifier'。當我使用索引列獲取數據時,它不會使用索引獲取數據。varchar不工作的索引列

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  |   |    | 

當使用'explain extended'進行檢查時,顯示'using where'而不是'using index'。這是否意味着數據沒有使用索引列獲取?以下是選擇查詢的'explain extended'結果。

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 | 
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+ 

'explain'的結果應該看起來像Extra。

+--------------------------+ 
    | Extra     | 
    +--------------------------+ 
    | Using index    | 
    +--------------------------+ 
+0

您可能會發現它有助於閱讀:http://meta.stackoverflow.com/a/271056/ –

+0

是否有實際的** **的問題在這裏或者是它只是你煩惱的是指數沒有被用過的?你的查詢很慢嗎? – Mjh

+0

請提供'SHOW CREATE TABLE'。 –

回答

1

請不要被命名非唯一索引混淆的東西「獨特的...」!

EXPLAIN看起來最佳。

「使用索引」(意爲「覆蓋」)說,需要只有索引。你有

PRIMARY KEY(id), 
INDEX(unique_identifier) 

,你出現使用的是InnoDB是。這意味着該索引真的是(unique_identifier, id),因爲(在InnoDB中),PK靜靜地添加到任何二級索引。

由於查詢只需要這兩列,它是「覆蓋」。

由於列被假定爲出現不止一次,它必須是「參考」和「使用,其中」。 「行數= 1」僅僅是因爲統計數據推斷該列非常接近獨特。

執行將

  • 向下鑽取的B +樹的定位第一發生「妙的」的索引
  • 掃描向前(這是有效的B +樹該InnoDB使用),直到找到不是「漂亮」的條目。

因此,它將在食指觸摸一個額外的「行」。如果它是UNIQUE,則不需要提前掃描。

2

這取決於查詢優化器如何獲取數據,可能是因爲對於小表而言,所有索引都會被忽略。 也可能是您的查詢不合適,我們必須能夠查看錶格並查詢是否有其他可以完成的事情。