mysql 查询类型 index 和 all 查询效率上的区别
表结构
CREATE TABLE `query_test` ( `ID` INT NOT NULL AUTO_INCREMENT, `NAME` VARCHAR(64) DEFAULT '', PRIMARY KEY (ID) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;
构造 50w 数据
DELIMITER $$ CREATE PROCEDURE insert_query_test(IN cnt INTEGER, IN tb VARCHAR(64)) BEGIN DECLARE char_str varchar(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; DECLARE return_str varchar(255) DEFAULT ''; DECLARE i int; set i=1; while i<=cnt DO SET return_str = concat(return_str, substring(char_str, FLOOR(1 + RAND()*62), 1)); set @stmt = CONCAT('INSERT INTO ',tb,' (NAME) VALUES("',return_str,'");'); PREPARE stmt_pre FROM @stmt; EXECUTE stmt_pre; DEALLOCATE PREPARE stmt_pre; SET i = i + 1; end while; END$$ DELIMITER ;
对比
- 查询 1,扫了全表,type=all,耗时 4.775s
SELECT * FROM query_test;
- 查询 2,扫了主键索引树,type=index,耗时 1.901s 。extra 提示 using index,只
SELECT ID FROM query_test;
问题
从聚簇索引的结构上看,叶子节点实际存储了索引值和具体的行数据。有一点不解的是,两个查询应该都扫描了聚簇索引的叶子节点(包括索引键和行数据),但是为什么查询 2 和快于查询 1 呢?
会不会是select *的查询数据量多于select id造成的?