本文主要介绍如何查看当前查询是否使用了索引。
本例中,建表语句如下:
obclient> CREATE TABLE tb(id int AUTO_INCREMENT PRIMARY KEY,name varchar(3), index idx_name (name));
Query OK, 0 rows affected (0.06 sec)
obclient>
obclient> INSERT INTO tb(name) VALUES ('a'),('b'),('c'),('d'),('e');
Query OK, 5 rows affected (0.04 sec)
Records: 5 Duplicates: 0 Warnings: 0
obclient> COMMIT;
Query OK, 0 rows affected (0.01 sec)
obclient> SEELCT * FROM tb;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+----+------+
5 rows in set (0.01 sec)
要查看查询是否使用了普通索引,可以在查询计划中查看 NAME 列。
如果使用了索引,在查询计划的 NAME 列可以看到表扫描的表名为索引表的名称
idx_name。如果没有使用索引,则会对查询的表进行全表扫描。obclient> EXPLAIN EXTENDED SELECT * FROM tb WHERE name='c'; | Query Plan | =========================================== |ID|OPERATOR |NAME |EST. ROWS|COST| ------------------------------------------- |0 |TABLE SCAN|tb(idx_name)|1 |35 | =========================================== Outputs & filters: ------------------------------------- 0 - output([tb.id(0x7f482c9eac00)], [tb.name(0x7f482c9ea8f8)]), filter(nil), access([tb.name(0x7f482c9ea8f8)], [tb.id(0x7f482c9eac00)]), partitions(p0), is_index_back=false, range_key([tb.name(0x7f482c9ea8f8)], [tb.id(0x7f482c9eac00)]), range(c,MIN ; c,MAX), range_cond([tb.name(0x7f482c9ea8f8) = 'c'(0x7f482c9ea2f0)]) Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA INDEX(@"SEL$1" "test.tb"@"SEL$1" "idx_name") END_OUTLINE_DATA */要查看查询是否使用了主键索引,可以在查询计划中查看
Outputs & filters中的range_key。如果使用了主键索引,在查询计划的
Outputs & filters中的range_key中,可以看到使用的是在创建表时指定的主键列,上例中为 id 列。obclient> EXPLAIN EXTENDED SELECT * FROM tb WHERE id BETWEEN 2 AND 3; | Query Plan | =================================== |ID|OPERATOR |NAME|EST. ROWS|COST| ----------------------------------- |0 |TABLE SCAN|tb |5 |36 | =================================== Outputs & filters: ------------------------------------- 0 - output([tb.id(0x7f482c9eab60)], [tb.name(0x7f482c9eae68)]), filter(nil), access([tb.id(0x7f482c9eab60)], [tb.name(0x7f482c9eae68)]), partitions(p0), is_index_back=false, range_key([tb.id(0x7f482c9eab60)]), range[2 ; 3], range_cond([(T_OP_BTW, tb.id(0x7f482c9eab60), ?, ?)(0x7f482c9e9cf0)]) Used Hint: ------------------------------------- /*+ */ Outline Data: ------------------------------------- /*+ BEGIN_OUTLINE_DATA FULL(@"SEL$1" "test.tb"@"SEL$1") END_OUTLINE_DATA */