我尝试了以下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** |
+----+-------------+------------------+-------+---------------+------+---------+-------------+------+----------+-------------+
答案 0 :(得分:1)
您的查询正在点击"NAME"
索引,如解释输出列"key"
中所示。
key
和extra
列的说明
键
键列表示MySQL实际决定使用的键(索引)。如果MySQL决定使用其中一个possible_keys索引来查找行,那么该索引将被列为键值。
使用
WHERE子句用于限制哪些行与下一个表匹配或发送到客户端。除非您特意打算从表中获取或检查所有行,否则如果Extra值不是Using where并且表连接类型为ALL或index,则查询可能会出错。即使您正在为WHERE子句的所有部分使用索引,您也可以看到如果列可以为NULL则使用where。