Mysql varchar上的索引列不工作
我有索引列“唯一标识符”。当我使用索引列获取数据时,它不是使用索引获取的Mysql varchar上的索引列不工作,mysql,indexing,Mysql,Indexing,我有索引列“唯一标识符”。当我使用索引列获取数据时,它不是使用索引获取的 mysql> show index from stock_index_table; +-------------------+------------+-------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+-----
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”。这是否意味着无法使用索引列获取数据?下面是select查询的“解释扩展”结果
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 |
+--------------------------+
| Using index |
+--------------------------+
如何获取数据取决于查询优化器,可能是对于一个小表,所有索引都被忽略。
也可能是您的查询不合适,我们必须能够查看表和查询,以查看是否还有其他可以执行的操作。如何获取数据取决于查询优化器,可能是对于一个小表,所有索引都被忽略。
也可能是您的查询不适合,我们必须能够查看表和查询,以查看是否还有其他可以执行的操作。请不要将非唯一索引命名为“unique…”来混淆问题
EXPLAIN
看起来很理想
“使用索引”(意思是“覆盖”)表示只需要索引。你有
PRIMARY KEY(id),
INDEX(unique_identifier)
您似乎正在使用InnoDB。这意味着索引实际上是(unique_identifier,id)
,因为(在InnoDB中),PK被悄悄地添加到任何二级索引中
因为查询只需要这两列,所以它是“覆盖”的
由于假定该列显示不止一次,因此它需要是“ref”和“using where”。“Rows=1”只是因为统计数据推断该列非常接近于唯一
死刑将被执行
- 向下钻取B+树中的索引,以查找第一个出现的“Nifty”
- 向前扫描(这在InnoDB使用的B+树中是有效的),直到它找到一个不是“漂亮”的条目
因此,它将触及索引中的一个额外“行”。如果它是唯一的,则不需要向前扫描。请不要将非唯一索引命名为“唯一…”,以免混淆
EXPLAIN
看起来很理想
“使用索引”(意思是“覆盖”)表示只需要索引。你有
PRIMARY KEY(id),
INDEX(unique_identifier)
您似乎正在使用InnoDB。这意味着索引实际上是(unique_identifier,id)
,因为(在InnoDB中),PK被悄悄地添加到任何二级索引中
因为查询只需要这两列,所以它是“覆盖”的
由于假定该列显示不止一次,因此它需要是“ref”和“using where”。“Rows=1”只是因为统计数据推断该列非常接近于唯一
死刑将被执行
- 向下钻取B+树中的索引,以查找第一个出现的“Nifty”
- 向前扫描(这在InnoDB使用的B+树中是有效的),直到它找到一个不是“漂亮”的条目
因此,它将触及索引中的一个额外“行”。如果它是
唯一的
,则无需提前扫描。您可能会发现阅读此内容很有帮助:这里是否存在实际问题,或者只是索引未被使用而困扰您?您的查询速度慢吗?请提供SHOW CREATE TABLE
。您可能会发现阅读此内容很有帮助:这里是否存在实际问题,或者只是索引未被使用而困扰您?您的查询速度慢吗?请提供SHOW CREATE TABLE
。