实验7.2 索引的测试
【实验目的】
①掌握如何创建索引才能提高查询速度。
②掌握获得执行计划的方法。
【实验内容】
新建测试数据表,建立存储过程插入数据到测试表,比较索引建立前后的查询速度以及分析索引与查询语句的关系。
【实验步骤】
使用SQL新建测试数据表test,建立存储过程批量插入数据到测试表,比较未建立索引和在不同列上建立索引后的查询语句的查询速度,分别获得执行计划并分析索引和查询语句的关系。
①在图标菜单中单击第一个图标
,新建一个查询窗口。
②在查询窗口输入下面的SQL语句并执行,创建测试索引的数据表test。
CREATE TABLE test(
id INT,
name VARCHAR(20),
gender CHAR(6),
email VARCHAR(50)
);
③再次创建一个查询窗口,输入以下SQL语句,创建批量插入数据的存储过程,实现批量插入记录。
DELIMITER $$
CREATE PROCEDURE auto_insert1()
BEGIN
DECLARE i INT DEFAULT 1;
WHILE(i<=50000)DO
INSERT INTO test VALUES(i,CONCAT('e',i),'male',CONCAT('e',i,'@oldboy'));
SET i=i+1;
END WHILE;
END$$
DELIMITER ;
④执行上面的语句,完成创建后刷新数据库可以看到新建立的存储过程,如图7.5所示。

图7.5 新建存储过程批量插入数据
⑤新建查询窗口,输入下面的SQL语句调用存储过程,由于插入数据量较大,存储过程执行结束大概要花费将近60秒的时间。
CALL auto_insert1();
⑥查询test表的数据,在查询窗口输入SQL语句并执行,如图7.6所示,表test的数据共有50 000行。

图7.6 执行存储过程后查询test表数据
⑦在没有索引的前提下测试查询速度。查询name为'e1000'的元组,输入以下SQL语句并执行,结果如图7.7所示,记下语句的执行时间。
SELECT * FROM test WHERE name='e1000';(https://www.daowen.com)

图7.7 没有索引的查询
⑧使用EXPLAIN语句获得上面查询语句的执行计划,输入以下SQL语句并执行,结果如图7.8所示。
EXPLAIN SELECT * FROM test WHERE name='e1000';

图7.8 使用EXPLAIN语句获得查询语句的执行计划
⑨在id列上加上索引并测试查询速度。输入以下SQL语句并执行,结果如图7.9所示,发现以id为数据项建立索引后,查询时,发现查询速度并没有加快。再次运行步骤⑦的EXPLAIN语句获得该查询语句的执行计划,发现执行结果和图7.8一样,说明该查询语句执行时并没有使用到idx索引,仍然是采用表扫描的方式完成的查询。
CREATE INDEX idx ON test(id);
SELECT * FROM test WHERE name='e1000';

图7.9 在id列建立索引后的查询
⑩在name列上创建索引并测试查询速度。输入以下SQL语句,选择第二条查询语句先执行,执行时间为0.031秒,再选择创建索引语句执行,成功创建以name为索引项的索引namex,再次选择查询语句执行,执行时间为0.000秒,说明查询速度已经提高,结果如图7.10所示。运行步骤⑦的EXPLAIN语句获得该查询语句的执行计划,执行结果如图7.11所示。查看key列,说明该查询语句执行时使用到namex索引,从而大大提高了查询速度。
CREATE INDEX namex ON test(name);
SELECT * FROM test WHERE name='e1000';

图7.10 在name列建立索引及查询

图7.11 使用EXPLAIN语句再次获得查询语句的执行计划