表结构
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造成的?