MySQL更新查询不使用索引列

时间:2016-04-01 04:09:45

标签: mysql performance indexing

我尝试了以下SQL查询来更新表INDEXED_MERCHANT,其中表中有10000条记录。我将“Name”和“A”都编入索引键,以提高更新查询性能。通过执行命令SHOW CREATE TABLE INDEXED_MERCHANT;,我将获得如下输出结果:

 INDEXED_MERCHANT | CREATE TABLE `INDEXED_MERCHANT` (
  `ID` varchar(50) NOT NULL,
  `NAME` varchar(200) DEFAULT NULL,
  `ONLINE_STATUS` varchar(10) NOT NULL,
  `A` varchar(100) DEFAULT NULL,
  `B` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`ID`),
  KEY `NAME` (`NAME`,`A`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

这意味着我的两个键都被识别为索引键。当我执行以下命令时,“额外”列结果表明查询不使用索引键。我该如何实现目标? 执行查询:EXPLAIN EXTENDED UPDATE INDEXED_MERCHANT SET ONLINE_STATUS = '0' WHERE NAME = 'A 205' AND A = 'P 205'; 结果:

+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+
| id | select_type | table            | type  | possible_keys | key  | key_len | ref         | rows | filtered | **Extra**       |
+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+
|  1 | SIMPLE      | INDEXED_MERCHANT | range | NAME          | NAME | 906     | const,const |    1 |   100.00 | **Using where** |
+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+

1 个答案:

答案 0 :(得分:1)

您的查询正在点击"NAME"索引,如解释输出列"key"中所示。

以下是mysql documentation

keyextra列的说明
  

键列表示MySQL实际决定使用的键(索引)。如果MySQL决定使用其中一个possible_keys索引来查找行,那么该索引将被列为键值。

  

使用

WHERE子句用于限制哪些行与下一个表匹配或发送到客户端。除非您特意打算从表中获取或检查所有行,否则如果Extra值不是Using where并且表连接类型为ALL或index,则查询可能会出错。即使您正在为WHERE子句的所有部分使用索引,您也可以看到如果列可以为NULL则使用where。